오다기리 박의 알고리즘 노트

[OpenGL로 배우는 컴퓨터 그래픽스] Chapter 10. 조명과 음영(Lighting and Shading) 본문

컴퓨터 그래픽스/OpenGL

[OpenGL로 배우는 컴퓨터 그래픽스] Chapter 10. 조명과 음영(Lighting and Shading)

오다기리 박 2019. 2. 14. 21:14

OpenGL로 배우는 3차원 컴퓨터 그래픽스



Chapter 10. 조명과 음영(Lighting and Shading)

Section 01. 조명 (Lighting)

  • 조명과 음영

    • 렌더링 = 조명(Lighting) + 음영(Shading)

    • Lighting : 광원과 물체 특성을 감안하여 정점에서의 빛 세기를 계산하는 작업

    • Shading : 이렇게 결정된 정점 색을 기준으로 해당 물체면 내부 곳곳마다 색을 부여하는 작업

  • 전역 조명모델과 지역 조명모델

    • 전역 조명모델 (Global Lighting Model) : 장면 내의 물체 상호간의 반사까지 고려한 모델

    • 지역 조명모델 (Local Lighting Model) : 광원으로부터 직접 물체에 부딪쳐 우리 눈에 들어오는 빛만 고려한 모델


Section 02. 지역 조명모델(Local Lighting Model)

  • 주변광 (Ambient)

    • 주변 반사에 의해 우리 눈으로 반사되는 빛

    • 시점의 위치에 무관하게 모든 물체면에 대해 일정 크기로 밝기를 증가시킴

    • <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>i</mi><mrow><mi>a</mi><mi>m</mi><mi>b</mi></mrow></msub><mo>=</mo><msub><mi>m</mi><mrow><mi>a</mi><mi>m</mi><mi>b</mi></mrow></msub><mo>&#x2297;</mo><msub><mi>s</mi><mrow><mi>a</mi><mi>m</mi><mi>b</mi></mrow></msub></math>

  • 난반사 (Diffuse)

    • 물체면과 광원과의 공간적인 관계에 따라 명암을 부여한 것

    • <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>i</mi><mrow><mi>d</mi><mi>i</mi><mi>f</mi><mi>f</mi></mrow></msub><mo>=</mo><mi mathvariant="bold-italic">n</mi><mo mathvariant="bold">&#xB7;</mo><mi mathvariant="bold-italic">l</mi><mo>=</mo><mi>cos</mi><mi>&#x3D5;</mi></math>

  • 정반사 (Specular)

    • Phong 조명 처리식

      • <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>i</mi><mrow><mi>s</mi><mi>p</mi><mi>e</mi><mi>c</mi></mrow></msub><mo>=</mo><msup><mfenced><mrow><mi mathvariant="bold-italic">r</mi><mo mathvariant="bold">&#xB7;</mo><mi mathvariant="bold-italic">v</mi></mrow></mfenced><msub><mi>m</mi><mrow><mi>s</mi><mi>h</mi><mi>i</mi></mrow></msub></msup><mo>=</mo><msup><mfenced><mrow><mi>cos</mi><mi>&#x3C1;</mi></mrow></mfenced><msub><mi>m</mi><mrow><mi>s</mi><mi>h</mi><mi>i</mi></mrow></msub></msup></math>

    • Blinn 조명 처리식

      • <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>i</mi><mrow><mi>s</mi><mi>p</mi><mi>e</mi><mi>c</mi></mrow></msub><mo>=</mo><msup><mfenced><mrow><mi mathvariant="bold-italic">n</mi><mo mathvariant="bold">&#xB7;</mo><mi mathvariant="bold-italic">h</mi></mrow></mfenced><msub><mi>m</mi><mrow><mi>s</mi><mi>h</mi><mi>i</mi></mrow></msub></msup><mo>=</mo><msup><mfenced><mrow><mi>cos</mi><mi>&#x3B8;</mi></mrow></mfenced><msub><mi>m</mi><mrow><mi>s</mi><mi>h</mi><mi>i</mi></mrow></msub></msup></math>

      • r계산이 필요없으므로 좀 더 빠르다

    • 정반사 성분은 시야 종속적 (view-dependent)

    • 점 p에서 색상 계산

      • <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>i</mi><mrow><mi>s</mi><mi>p</mi><mi>e</mi><mi>c</mi></mrow></msub><mo>=</mo><mi>m</mi><mi>a</mi><mi>x</mi><msup><mfenced><mrow><mfenced><mrow><mi mathvariant="bold-italic">n</mi><mo mathvariant="bold">&#xB7;</mo><mi mathvariant="bold-italic">h</mi></mrow></mfenced><mo>,</mo><mn>0</mn></mrow></mfenced><msub><mi>m</mi><mrow><mi>s</mi><mi>h</mi><mi>i</mi></mrow></msub></msup><msub><mi>m</mi><mrow><mi>s</mi><mi>p</mi><mi>e</mi><mi>c</mi></mrow></msub><mo>&#x2297;</mo><msub><mi>s</mi><mrow><mi>s</mi><mi>p</mi><mi>e</mi><mi>c</mi></mrow></msub></math>

      • <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>m</mi><mrow><mi>s</mi><mi>h</mi><mi>i</mi></mrow></msub><mo>&#xA0;</mo><mo>:</mo></math> 표면의 광택도 (shininess) : 클수록 하이라이트가 좁고 표면이 반질반질하게 보임



  • 조명모델

    • 입력

      • 광원 색상

      • 물체의 반사계수

      • 전반사 지수 :

    • 출력 색상


Section 03. 음영(Shading)

  • Flat 셰이딩

    • 하나의 삼각형의 법선벡터가 모두 같다.

    • 색상값은 개별 삼각형에 대해서 계산되고 그 삼각형 전체가 이 색으로 채워짐

    • 삼각형 중심점에 조명모델을 가하고 그 결과 색으로 삼각형 내부를 모두 동일하게 채운다

    • 실행시간 빠름

    • “mach band effct” 발생

  • Gouraud 셰이딩

    • 정점의 법선벡터는 인접 면의 법선벡터를 평균하여 구한다.

    • 삼각형의 각 정점에서 조명값이 정해지고, 계산된 색상이 삼각형의 표면 전체로 보간됨

    • 삼각형의 정점에서만 조명 효과를 계산하기 때문에 빠른편

    • 객체의 LOD에 따라 셰이딩 품질이 달라짐.

    • LOD가 높아지면 Phong 셰이딩효과를 낼 수 있으며 알고리즘이 느려진다. 이 방법을 이용하면 Gouraud 셰이딩을 하드웨어가 Phong 셰이딩기처럼 동작하도록 할 수 있다.

    • 정반사 하이라이팅을 잘 표시하지 못함, spot light 효과를 잘 살리지 못함.

    • “mach band effct” 발생

  • Phong 셰이딩

    • 정점의 법선벡터는 인접 면의 법선벡터를 평균하여 구한다.

    • 각 정점의 법선을 이용하여 삼각형에 해당되는 각 픽셀의 법선 벡터를 보간함. (이 법선은 이후에 그 점에서 조명 효과를 계산하는 데 사용됨.)

    • 픽셀별 조명 처리를 하는 것은 정점별 조명 처리(Gouraud 셰이딩)보다 복잡하고 비용이 크다.

    • 모델링 시에 곡면을 평면에 근사시키지만 렌더링 단계에서 원래 곡면의 방향을 복원하여 조명모델을 계산함으로써 정밀도를 기한다.

    • 벡터를 보간하기 때문에 Gouraud 셰이딩보다 3배 느리다


Section 04. GL 조명과 음영

  1. Lighting 활성화

  • 조명기능이 활성화되면 물체의 색은 광원과 물체의 특성에 의해서만 좌우되고 glColor*() 함수의 기능은 무시된다.

  • glEnable(GL_LIGHTING)
    glDisable(GL_LIGHTING)

  1. Light 정의

  • 1) Light 활성화

    • glEnable(GL_LIGHT0~7)

  • 2) Light 종류, 색 명시

    • void glLightfv(GLenum  light, GLenum  pname, const GLfloat *params);

    • pname 종류

pname 종류

기본값

의미

GL_AMBIENT

(0,0,0,1)

광원의 주변광

GL_DIFFUSE

(1,1,1,1)

광원의 난반사

GL_SPECULAR

(1,1,1,1)

광원의 정반사


  • 3) 거리에 따른 빛의 약화

    • <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>f</mi><mrow><mi>a</mi><mi>t</mi><mi>t</mi><mi>e</mi><mi>n</mi><mi>u</mi><mi>a</mi><mi>t</mi><mi>i</mi><mi>o</mi><mi>n</mi></mrow></msub><mo>=</mo><mfrac><mn>1</mn><mrow><mi>a</mi><mo>+</mo><mi>b</mi><mi>D</mi><mo>+</mo><mi>c</mi><msup><mi>D</mi><mn>2</mn></msup></mrow></mfrac></math>

    • void glLightfv(GLenum  light, GLenum  pname, const GLfloat *params);

    • pname 종류

pname 종류

기본값

의미

GL_CONSTANT_ATTENUATION

1

a 계수

GL_LINEAR_ATTENUATION

0

b 계수

GL_QUADRATIC_ATTENUATION

0

c 계수


  • 4) Light의 위치 제어

    • 고정위치

    • 움직이는 광원

    • 시점을 따라가는 광원

    • pname 종류

pname 종류

기본값

의미

GL_POSITION

(0,0,1,0)

광원의 (x,y,z,w)

GL_SPOT_DIRECTION

(0,0,-1)

스포트라이트의 방향

GL_SPOT_CUTOFF

180

조명각

GL_SPOT_EXPONENT

0

코사인 승수


  1. Shading Model 정의

  • glShadeModel(GL_SMOOTH);
    glShadeModel(GL_FLAT);

  1. Surface Normal 정의

  • void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);

  • 정규화 : glEnable(GL_NORMALIZE);

  1. Surface Material Property 정의

  • 물체면의 색과 매끄러움 같은 특성을 정의하는 것

  • void glMaterialfv(GLenum  face, GLenum  pname, const GLfloat *params);

    • face종류

face 종류

GL_FRONT

GL_BACK

GL_FRONT_AND_BACK


    • pname종류

pname 종류

기본값

의미

GL_AMBIENT

(0.2,0.2,0.2,1)

주변광에 대한 물체색

GL_DIFFUSE

(0.8,0.8,0.8,1)

난반사에 대한 물체색

GL_AMBIENT_AND_DIFFUSE


주변광+난반사에 대한 물체색

GL_SPECULAR

(0,0,0,1)

정반사에 대한 물체색

GL_EMISSION

(0,0,0,1)

물체의 발광색

GL_SHININESS

0

정반사의 광택계수


  1. Lighting Model 정의

  • 광원, 물체특성과 직접 연관되지 않는 것들을 정의한다.

  • 1) 전역 주변광

    • ex) GLfloat MyGlobalAmbient[ ] = {0.2, 0, 0, 1};
             glLightModelfv(GL_LIGHT_MODEL_AMBIENT, MyGlobalAmbient);

  • 2) 시점 위치

    • glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);

      • 시점 위치가 물체에 매우 가까운 것으로 간주되어 물체면을 구성하는 모든 삼각형마다 별도의 시점벡터가 계산된다. 정확한 정반사가 계산되고 사실적인 결과를 얻지만 계산시간이 오래걸린다.

    • glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_FALSE);

      • 시점이 시점벡터방향으로 무한대 거리에 있는 것으로 간주되어 모든 삼각형 메쉬에 대해 동일한 시점벡터를 사용하므로 계산시간을 줄일 수 있다.

  • 3) 양면 조명

    • 동시에 front face와 back face가 노출될 때에는 양면 모두에 lighting과 shading을 가해야 한다.

    • glLightModeli(GL_LIGHT_MODEL_TWO_SIDED, GL_TRUE);

      • 양면 모두에 광원이 작용한다.

      • 이 경우 glMaterialfv()로 양면의 물체 특성을 정의해야한다.

    • glLightModeli(GL_LIGHT_MODEL_TWO_SIDED, GL_FALSE);

      • 표면에만 광원이 작용한다.

  • void glLightModeli(GLenum pname, GLint  param);

    • pname 종류

pname 종류

기본값

의미

GL_LIGHT_MODEL_AMBIENT

(0.2,0.2,0.2,1)

전역 주변광 RGBA

GL_LIGHT_MODEL_LOCAL_VIEWER

GL_FALSE

시점벡터 계산법

GL_LIGHT_MODEL_TWO_SIDE

GL_FALSE

이면 조명 여부