G.I.S Developer, 개발자 김형준(Dip2K)  
Front Page
Notice | Keyword | Tag | E-Mail | Guestbook | Admin | Write Article   
 
2007/10/13 04:32 2007/10/13 04:32
OpenGL Shader - 32
GLSL 예제 : Texture(MultiTexture) - 3/3
원문 : http://www.lighthouse3d.com/opengl/glsl/index.php?textureMulti

멀티 텍스쳐링은 GLSL에서는 정말 쉽다. 해야할 것은 두개의 텍스쳐에 접근하는 일이 전부다. 그리고 이 장에서는 동일한 텍스쳐 좌표를 사용할 것이기 때문에 버텍스 쉐이더를 재작성하지 않고 이전 강좌의 것을 그대로 사용한다. 프레그먼트 쉐이더 또한 두개의 텍스쳐 색상을 추가하는 최소한의 변화만 있다.
varying vec3 lightDir,normal;
uniform sampler2D tex,l3d;

void main()
{
    vec3 ct,cf;
    vec4 texel;
    float intensity,at,af;
		
    intensity = max(dot(lightDir,normalize(normal)),0.0);
	
    cf = intensity * (gl_FrontMaterial.diffuse).rgb + 
         gl_FrontMaterial.ambient.rgb;
    af = gl_FrontMaterial.diffuse.a;
	
    texel = texture2D(tex,gl_TexCoord[0].st)+
            texture2D(l3d,gl_TexCoord[0].st);

    ct = texel.rgb;
    at = texel.a;
	
    gl_FragColor = vec4(ct * cf, at * af);	
}
그리고 이제, 약간 다른 특별한 것을 해보자: Glow in the Drak Effect. 이 특별한 효과는 두번째 텍스쳐를 어둠속에서 타오르는듯하게 보이는 것이다. 예를들어, 완전이 밝아졌다가 어두워지는 듯한 효과.
두 단계로 최종 색상을 다시 계산해야 하는데, 먼저 첫번째 텍스쳐를 프레그먼트 색상으로 조정된 상태의 색상을 계산하고, 이후에 두번째 텍스쳐 유닛을 강도에 기반해서 추가하는 것이다.

intensity가 0이라면, 두번째 텍스쳐가 전체적으로 완전하게 표시된다. 반대로 intensity가 1이라면, 두번째 텍스쳐를 10% 정도만 표시되도록 한다. 이런 표시를 위해 smoothStep라는 함수를 통해 구현할 것이다. 이 함수의 시그니쳐는 다음과 같다.
genType smoothStep(genType edge0, genType edge1, genType x);
만약 x<=edge0이면 결과는 0이고,  x>=edge1이면 1 그리고 edge0< x <edge1이면 Hermit 보간 연산이 수행된다. 우리의 경우 다음 함수를 호출한다.
coef = smoothStep(1.0, 0.2, intensity);
다음은 프레그먼트 쉐이더 코드이다.
varying vec3 lightDir,normal;
uniform sampler2D tex,l3d;

void main()
{
    vec3 ct,cf,c;
    vec4 texel;
    float intensity,at,af,a;
	
    intensity = max(dot(lightDir,normalize(normal)),0.0);
	
    cf = intensity * (gl_FrontMaterial.diffuse).rgb + 
             gl_FrontMaterial.ambient.rgb;
    af = gl_FrontMaterial.diffuse.a;
	
    texel = texture2D(tex,gl_TexCoord[0].st);
		
    ct = texel.rgb;
    at = texel.a;
	
    c = cf * ct;
    a = af * at;
		
    float coef = smoothstep(1.0,0.2,intensity);
    c += coef *  vec3(texture2D(l3d,gl_TexCoord[0].st));
	
    gl_FragColor = vec4(c, a);	
}

이 글이 도움이 되셨다면, 짧은 댓글이라도 달아주시길, 큰 힘이 됩니다. ^^*

Tag : ,
Track this back : http://www.gisdeveloper.co.kr/trackback/332
Commented by 황동성 at 2010/03/29 16:38  r x
급하게 OpenGL을 익혀야되는 상황에 김형준님 블로그 OpenGL강의가 많이 도움이 되었습니다. 그리하여 본격적으로 OpenGL ES를 공부해야되서 서점에가서 책을 샀더니 김형준님께서 번역하신거더라구요. 한 10일동안 김형준님의 작품속에서 시간을 보냈네요. 감사합니다^0^
Replied by 김형준 at 2010/03/30 12:57 x
도움이 되셨다니 좋습니다. ^^ 댓글 감사합니다.
Commented by 박성민 at 2010/05/14 08:30  r x
안녕하십니까^^ 이렇게 OPENGL을 차근차근 개념적으로 설명 하셔서 너무 많은 도움이 된 듯 합니다.
제가 3D 초보 개발자 인데 고수님의 의견을 듣고자 이렇게 글을 남겨 봅니다.
제가 하는 것은 2D를 그려 그걸 딜로니 삼각화와 넙스 곡면 처리등을 통해 3D로 만들어 주는 것입니다. 또 한 텍스쳐링 까지 가능 하고요.

하지만 여기서 문제점이 있어 여쭤 봅니다. 텍스쳐링을 하게 될 때 PNG파일로 택스쳐링을 하게 되면 원하는 결과가 나오지 않아 답답하기 짝이 없습니다.

PNG의 투명한 부분이 검정색으로 보여져 버립니다. 제가 원레 원한 결과는 투명한 부분은 투명하여 원레의 형상이 보이고 그렇지 아니한 부분은 png 파일에서의 rgb 값을 보여지게 하고 싶습니다.
블렌딩으로 하게 되면 완전 투시(?)가 되어 버려 큐브를 예로 들자면 큐브의 면까지도 날아가버립니다.


저는 png 텍스쳐를 단지 큐브 위에 올린다는 생각으로 입히고 싶은데 좋은 말씀이나 구현 방법이 있으시면 쪼금 도움을 주시면 정말 감사하겠습니다. magicpd@nate.com 제 메일 주소입니다.^^

ps. 정말 좋은 글들 잘 보고 갑니다.
Replied by 김형준 at 2010/05/23 00:39 x
요즘 일로 이래 저래 치여 댓글을 이제서야 달아 드립니다. 기억이 가물가물한데.. 텍스쳐링도 알파값에 의해 투명도 처리가 되는 것으로 알고 있습니다. http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=08 를 참고하시기 바랍니다. 일단 블랜딩과 밀접한 관련이 있으시 위의 url을 참고하시고 그래도 않된다면 다시 한번 더 글을 남겨주시기 바랍니다.
Replied by 황동성 at 2010/06/10 23:04 x
저도 몇일전에 비슷한 일로 애먹었었습니다.

initial할때 다음과같이 설정해보세요.
glColorMask (TRUE, TRUE, TRUE, TRUE)
Commented by 김태중 at 2010/06/01 14:38  r x
항상 많은 도움이 됩니다. 셰이더에 대해 책보다 더 이해가 쉽네요~~
감사합니다~~
Replied by 김형준(Dip2K) at 2010/06/03 00:53 x
저 역시 감사드립니다. ^^

[로그인][오픈아이디란?]
name    password    homepage
 hidden
BLOG main image
 Notice
[DuraMap-Xr] 소개 및 다운로드
[DuraMap-Xr] FAQ
개발과 관련한 질문은..
OpenGL Tutorials
운영자(Dip2K)에 대해
 Category
전체 (387)
GIS 개발 (82)
프로그래밍 (180)
스치는 생각들 (116)
번역 또는 집필 (3)
 TAGS
GIS OpenGL Shader Xr Algorithm Map Engine WPF ArcObjects ArcGIS C++
 Calendar
«   2010/07   »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
 Recent Entries
XrGeocoder - 주소를 좌표... (1)
XrProjection, 좌표계 변... (19)
[Java] 파생 클래스가 아...
[Java] 정적 초기화 블럭(...
[DuraMap-Xr] 그리드 레이...
 Recent Comments
감사합니다!!! 이렇게 직...
김지훈 - 07/29
감사 감사~ 근데.. 이글은...
김형준 - 07/29
친절한 해석 감사드려요^^
안토니오 - 07/29
별말씀을요.. ^^ 댓글에...
김형준 - 07/28
최근에 XrGeocoder라는 툴...
김형준 - 07/28
네, 요즘은 바로 도움을...
김형준 - 07/28
이래 저러 경황이 없어 댓...
김형준 - 07/28
잘 봤습니다. 큰 도움이...
gekko - 07/27
혹시 주소를 좌표로 변환...
김지훈 - 07/25
감사드립니다.. 바빠서 몇...
임은섭 - 07/23
 Archive
2010/07
2010/06
2010/05
2010/04
2010/03
2010/02
2010/01
2009/12
2009/11
2009/10
2009/09
2009/08
 Link Site
Adobe Flex 3 Help
Cartograph 2.0
GIS 위키디피아
GIS 프로그래밍 연구소
MapTools.org
OGC
OGRE3D
OSGeo 한국 지부
Wikipedia
국가수자원관리 정보시스템
국립지리원
국토연구원
국토해양부
네이버 과학
대한측량협회
류광님의 블로그
비지니스 GIS
이민파님의 공간분석과 리...
 Visitor Statistics
Total : 659265
Today : 81
Yesterday : 451
태터툴즈 배너
rss