G.I.S Developer, 개발자 김형준(Dip2K)  
Front Page
Notice | Keyword | Tag | E-Mail | Guestbook | Admin | Write Article   
 
2007/10/06 23:39 2007/10/06 23:39
OpenGL Shader - 26
GLSL 예제 : Lighting(Directional Lights 2) - 3/6
원문 : http://www.lighthouse3d.com/opengl/glsl/index.php?ogldir2

OpenGL의 Directional 빛에 대한 Specular 요소에 대한 시간이다. 사용한 광원공식 모델은 Blinn-Phong 모델로써, 이 모델은 Phong 모델을 간략화한 것이다.

Phong 모델은 Specular 요소는 빛의 반사벡터와 시선벡터 사이의 cosine에 비례함을 나타낸다.
L은 광원에서 버텍스까지로 형성된 벡터이다. N은 법선벡터이고 Eye는 버텍스로부터 눈(카메라)까지의 벡터이다. R은 벡터 L이 표면에 반사되어진 벡터다. Specular 요소는 각 alpha의 consine에 비례한다.

만약 눈(카메라) 벡터(시선벡터)가 반사 벡터와 일치한다면, 최대의 강도를 갖는 Specular를 얻을것이다. 시선벡터가 반사벡터로부터 갈라지면, Specular 강도는 쇠퇴한다. 쇠퇴정도는 Shininess 값으로 조절할 수 있다. 더 높은 Shininess 값은 더 빠르게 Specular를 감퇴시킨다. 이것의 의미는 높은 Shininess를 가진 것이 더 낮은 Shininess를 가진것보다 밝기스팟의 크기가 작아짐을 의미한다. OpenGL에서 Shininess는 0~128 사이의 값이고 밝기스팟의 크기를 조절하는 값이라고 생각하면 쉽다.

반사 벡터에 대한 공식은 다음과 같다.

그리고 Phong 모델식을 사용하는 OpenGL에서 Specular 요소는 다음과 같다.

지수 s가 Shininess 값이고 Ls는 빛의 Specular 강도이며, Ms는 재질에 대한 Specular 계수이다.

Blinn은 좀더 빠르고 이해하기 쉬운 Phong 모델을 간략화해서 제안하였는데, 그것이 바로 Blinn-Phong 모델이며 Half-Vector에 기반한다. Half-Vector는 시선벡터와 광원벡터 사이의 각을 반으로 하여 고려한다는 것으로 다음 그림을 보면 이해가 쉬울것이다.
Specular 요소의 강도는 법선벡터와 H 벡터 사이의 Cosine 값에 의존한다. Half-Vector에 대한 공식은 반사벡터에 대한 것보다 훨씬 간단하다.

그리고 Blinn-Phong 모델을 사용하는 OpenGL에서의 Specualr 요소 값은 다음과 같다.

이것이 실제 그래픽스 하드웨어의 고정기능에서 일반적으로 사용되는 식이다. 우리는 지금 OpenGL의 Directional 빛을 모방하길 원하므로, 쉐이더에서 이 마지막 공식을 사용한다. 여기에 좋은 소식이 있는데, OpenGL은 우리를 위해 Half-Vector를 계산해 준다는 것이다! 아래 코드를 살펴보길 바란다.
/* compute the specular term if NdotL is larger than zero */
if (NdotL > 0.0) {
    // normalize the half-vector, and then compute the 
    // cosine (dot product) with the normal
    NdotHV = max(dot(normal, gl_LightSource[0].halfVector.xyz),0.0);
    specular = gl_FrontMaterial.specular * gl_LightSource[0].specular * 
        pow(NdotHV,gl_FrontMaterial.shininess);
}

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

Tag : ,
Track this back : http://www.gisdeveloper.co.kr/trackback/322
Commented by IRIS at 2009/06/25 17:25  r x
GL기반 소프트웨어 렌더러를 제작중인데 이 글 보고 Phong 모델에서 Blinn-Phong 모델로 바꿨습니다. 나머지는 거의 다 구현했는데 프리미티브 자르기가 짜증이 좀 나네요.
어쨌든 많은 도움 되었습니다. ^^
Commented by 김형준 at 2009/06/26 10:04  r x
IRSI님, 소프트웨어 렌더러가.. OpenGL의 드라이버 구현을 직접 하셨다는 얘기겠지요? 아무튼, 도움 되셨다니 다행입니다~

[로그인][오픈아이디란?]
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