게임 프로그래머를 위한
리얼타임 렌더링
- 조명편 -
2018.01.26 데브루키 발표자 이석우
발표자 소개
 이석우 (1987년생)
 게임 회사로 이직 희망하는 병특(전문연구요원)
 발표자료에 대한 오류사항이나 궁금한 점이 있으면 아래의 메일로 연락주세요.
kkndsta@naver.com
참고자료
 게임 프로그래밍을 위한 3차원 그래픽스 - 저자 : 한정현 -
지난 이야기
 그래픽스 파이프라인에서 프래그먼트 처리 단계는 프래그먼트의 색상을 구한다.
 색상은 텍스쳐링과 조명 등을 통해 구해진다.
조명이란 무엇인가
 조명(illumination or lighting)은 광원과 물체 사이의 상호작용을 처리하는 기술이다.
 조명 모델
 국소 조명 모델(Local illumination)
 전역 조명 모델(global illumination)
국소 조명 모델
 광원과 표면 재질의 특성만을 고려한 조명 모델이다.
 직접 조명(direct lighting)이라고 한다.
 계산이 간단하지만 퀄리티가 떨어진다.
전역 조명 모델
 현실에서는 모든 표면에 빛이 간접적으로 도달한다. (장면의 특정 위치에서 광원이
보이지 않더라도, 조명은 다른 표면의 반사나 굴절 등을 통해 그 위치에 전달된다.)
 이러한 간접 조명을 고려하기 위해 전역 조명 모델(global illumination)은 주변 물체
들을 잠재적인 광원으로 본다.
전역 조명 모델의 문제점
 계산하는 데 너무 많은 비용이 든다.
 레스터라이제이션 기반의 GPU 아키텍쳐는 국소 조명 모델이 더 적절하다.
전역 조명 모델의 동향
 정밀한 GI를 이용하기 보다는 계산을 간략화한 GI를 이용한다.
 GI를 미리 계산한 후 텍스쳐에 저장하여 이를 실시간에 사용한다.
오늘 발표
 프래그먼트 처리 단계에서 사용되는 국소 조명 모델에 대해서 알아본다.
Phong Lighting model
 가장 보편적인 국소 조명 모델이다.
 디퓨즈, 스펙큘러, 엠비언트, 발광 항을 고려한다.
Diffuse term
 디퓨즈 항은 객체의 표면에 부딪힌 후 전방향으로 흩어지는 빛을 표현한다
 물체의 표면으로 들어온 빛은 모든 방향으로 같은 강도로 반사된다. 이를 난반사라
부른다.
 따라서, 반사량은 카메라 시선(시야 방향)에 무관하다.
Diffuse term - Lambert’s law -
 대신 반사량은 물체 표면에 들어오는 빛의 양에 비례한다.
 빛의 양은 노말 벡터와 빛 벡터의 내적으로 측정할 수 있다.
 이를 람베르트 법칙이라 한다.
빛의 양 = max 𝑛 ∙ 𝑙, 0 = max(𝑛𝑙𝑐𝑜𝑠𝜃, 0)
𝑝: 물체 표면 위의 한 점
𝑙 : 빛벡터
𝑛: 노말벡터
𝜃: 입사각
Diffuse term - Lambert’s law -
 그림 (b)와 같이 노말 벡터와 빛 벡터의 방향이 같을 경우, 빛의 양이 가장 크다.
 그림 (c)와 같이 입사각이 90도일 경우, 값이 0이 된다.
 그림 (d)와 같이 입사각이 90도 이상일 경우 내적은 음의 값이 된다. 이럴 경우 빛의
양은 0으로 한다.
max 𝑛𝑙𝑐𝑜𝑠0, 0 = 𝑛𝑙 max 𝑛𝑙𝑐𝑜𝑠90°
, 0 = 0 max 𝑛𝑙𝑐𝑜𝑠120°
, 0 = 0
Diffuse term - 빛의 색과 재질 -
 빛의 양 이외에도 추가적으로 빛의 고유색과 재질의 디퓨즈 반사율(diffuse
reflectance)을 고려하여 디퓨즈 항을 계산한다.
𝐿 𝑑 = max 𝑛 ∙ 𝑙, 0 𝑠 𝑑 ⊗ 𝑚 𝑑
𝐿 𝑑 : 디퓨즈 항
𝑠 𝑑 : 빛의 고유색
𝑚 𝑑 : 재질의 디퓨즈 반사율
Diffuse term - 빛의 색과 재질 -
 백색 빛 (1, 1, 1)이 물체의 표면 반사 노란빛을 띤다면 빨강색과 초록색은 반사하고
파란색을 흡수한다. 재질 파라미터를 이용하여 이러한 종류의 필터링이 가능하다.
(1, 1, 1) ⊗ (1, 1, 0) = (1, 1, 0) (0.5, 0.5, 0.5) ⊗ (0.5, 1, 0.5) = (0.25, 0.5, 0.25)
𝑠 𝑑 ⊗ 𝑚 𝑑
Diffuse term
 디퓨즈 항을 적용한 결과
Specular term
 스펙큘러 항은 물체 표면에 하이라이트(highlight)를 만드는데 사용되며 정반사라
부른다.
 스펙큘러 항은 계산하기 위해 시야 벡터, 반사 벡터, 빛벡터를 이용한다.
Specular term -반사 벡터-
 반사 벡터 유도
Specular term -시야 벡터-
 디퓨즈 항이 시야 벡터에 독립적인 반면 스펙큘러 항은 시야 벡터에 의존한다.
 하이라이트의 감소되는 정도는 (𝑟 ∙ 𝑣) 𝑠ℎ
로 근사적으로 계산되며, sh는 표면의 반짝임
(shininess)를 의미한다.
 완벽히 매끄러운 표면의 경우, sh값은 무한대가 되고 𝜌 = 0일 경우에만 카메라에 보인다.
 그렇지 않은 표면에서는, 𝜌가 0일 때 가장 큰 하이라이트가 생기고 𝜌가 커질수록 급격히
감소한다.
Specular term -하이라이트-
 sh값에 따른 결과
Specular term
 스펙큘러 항의 최종식은 아래와 같다.
 디퓨트 항의 재질과는 달리 스펙큘러 항의 재질 특성은 (0.9, 0.9, 0.9), (0.8, 0.8, 0.8)
등과 같이 회색조(gray-scale)로 표현되는데, 이는 하이라이트가 광원을 띄게 하기
위함이다.
Ambient term
 앰비언트 항은 장면 속 물체들로 반사된 빛을 근사적으로 표현한다. 흔히 간접광이
라 부른다.
 퐁 모델에서 엠비언트 항은 빛이 물체의 모든 표면에 동일한 광도로 반사된다.
Emissive term
 마지막으로 발산광은(emissive light)은 표면 그 자체에서 발산하는 빛을 묘사한다.
Phong Lighting Model
 퐁 모델은 네 개 항을 더하여 다음과 같이 정의된다.
Shader
 쉐이더는 GPU에서 실행가능한 프로그램을 의미하여, 프로그래머가 제어 할 수 있다.
쉐이딩 언어
 C 언어와 매우 유사하다.
 Hight Level Shading Launguage(HLSL) by Microsoft
 GLSL(OpenGL Shading Language) by OpenGL
 벡터와 행렬 같은 특수한 데이터 타입을 지원한다.
 입력 데이터의 두가지 종류
 Varing data: 쉐이더를 실행할 때마다 변하는 데이터(예 : 버텍스)
 Uniform data : 다수의 쉐이더에서 공유되는 일정한 값(예 : 월드 행렬)
Per-vertex Lighting
 Per-vertex Lighting은 버텍스 쉐이더에서 조명을 계산한다.
Per-vertex Lighting
 버텍스 쉐이더에서 계산된 조명 값은 래스터 라이져 단계에서 선형 보간되어 픽셀
단위의 값들로 저장된다.
Per-vertex Lighting 의 문제점
 하나의 삼각형을 이루는 3개의 버텍스에 하이라이트가 없을 경우, 삼각형 사이에 점 p에
서 하이라이트가 존재해도 Per-vertex Lighting의 결과는 하이라이트가 보이지 않는다.
Per-vertex Lighting
Per-fragment Lighting
실제 조명
Per-vertex Lighting 의 문제점
 이 문제는 카메라가 움직일 때 더욱 두드러져 하이라이트가 없어졌다 갑자기 생기
는 현상이 발생한다.
Per-fragment Lighting
 Per-vertex Light 문제를 해결하기 위해 프래그먼트에서 조명을 계산한다.
Per-fragment Lighting
 픽셀 세이더에서 조명을 계산하기 전, 노말
벡터를 반드시 정규화 해야한다. 래스터라
이저 단계에서 보간된 노말 벡터는 일반적
으로 단위벡터가 아니기 때문이다.
Q&A

리얼타임 렌더링 - 조명 입문편 -

  • 1.
    게임 프로그래머를 위한 리얼타임렌더링 - 조명편 - 2018.01.26 데브루키 발표자 이석우
  • 2.
    발표자 소개  이석우(1987년생)  게임 회사로 이직 희망하는 병특(전문연구요원)  발표자료에 대한 오류사항이나 궁금한 점이 있으면 아래의 메일로 연락주세요. kkndsta@naver.com
  • 3.
    참고자료  게임 프로그래밍을위한 3차원 그래픽스 - 저자 : 한정현 -
  • 4.
    지난 이야기  그래픽스파이프라인에서 프래그먼트 처리 단계는 프래그먼트의 색상을 구한다.  색상은 텍스쳐링과 조명 등을 통해 구해진다.
  • 5.
    조명이란 무엇인가  조명(illuminationor lighting)은 광원과 물체 사이의 상호작용을 처리하는 기술이다.  조명 모델  국소 조명 모델(Local illumination)  전역 조명 모델(global illumination)
  • 6.
    국소 조명 모델 광원과 표면 재질의 특성만을 고려한 조명 모델이다.  직접 조명(direct lighting)이라고 한다.  계산이 간단하지만 퀄리티가 떨어진다.
  • 7.
    전역 조명 모델 현실에서는 모든 표면에 빛이 간접적으로 도달한다. (장면의 특정 위치에서 광원이 보이지 않더라도, 조명은 다른 표면의 반사나 굴절 등을 통해 그 위치에 전달된다.)  이러한 간접 조명을 고려하기 위해 전역 조명 모델(global illumination)은 주변 물체 들을 잠재적인 광원으로 본다.
  • 8.
    전역 조명 모델의문제점  계산하는 데 너무 많은 비용이 든다.  레스터라이제이션 기반의 GPU 아키텍쳐는 국소 조명 모델이 더 적절하다.
  • 9.
    전역 조명 모델의동향  정밀한 GI를 이용하기 보다는 계산을 간략화한 GI를 이용한다.  GI를 미리 계산한 후 텍스쳐에 저장하여 이를 실시간에 사용한다.
  • 10.
    오늘 발표  프래그먼트처리 단계에서 사용되는 국소 조명 모델에 대해서 알아본다.
  • 11.
    Phong Lighting model 가장 보편적인 국소 조명 모델이다.  디퓨즈, 스펙큘러, 엠비언트, 발광 항을 고려한다.
  • 12.
    Diffuse term  디퓨즈항은 객체의 표면에 부딪힌 후 전방향으로 흩어지는 빛을 표현한다  물체의 표면으로 들어온 빛은 모든 방향으로 같은 강도로 반사된다. 이를 난반사라 부른다.  따라서, 반사량은 카메라 시선(시야 방향)에 무관하다.
  • 13.
    Diffuse term -Lambert’s law -  대신 반사량은 물체 표면에 들어오는 빛의 양에 비례한다.  빛의 양은 노말 벡터와 빛 벡터의 내적으로 측정할 수 있다.  이를 람베르트 법칙이라 한다. 빛의 양 = max 𝑛 ∙ 𝑙, 0 = max(𝑛𝑙𝑐𝑜𝑠𝜃, 0) 𝑝: 물체 표면 위의 한 점 𝑙 : 빛벡터 𝑛: 노말벡터 𝜃: 입사각
  • 14.
    Diffuse term -Lambert’s law -  그림 (b)와 같이 노말 벡터와 빛 벡터의 방향이 같을 경우, 빛의 양이 가장 크다.  그림 (c)와 같이 입사각이 90도일 경우, 값이 0이 된다.  그림 (d)와 같이 입사각이 90도 이상일 경우 내적은 음의 값이 된다. 이럴 경우 빛의 양은 0으로 한다. max 𝑛𝑙𝑐𝑜𝑠0, 0 = 𝑛𝑙 max 𝑛𝑙𝑐𝑜𝑠90° , 0 = 0 max 𝑛𝑙𝑐𝑜𝑠120° , 0 = 0
  • 15.
    Diffuse term -빛의 색과 재질 -  빛의 양 이외에도 추가적으로 빛의 고유색과 재질의 디퓨즈 반사율(diffuse reflectance)을 고려하여 디퓨즈 항을 계산한다. 𝐿 𝑑 = max 𝑛 ∙ 𝑙, 0 𝑠 𝑑 ⊗ 𝑚 𝑑 𝐿 𝑑 : 디퓨즈 항 𝑠 𝑑 : 빛의 고유색 𝑚 𝑑 : 재질의 디퓨즈 반사율
  • 16.
    Diffuse term -빛의 색과 재질 -  백색 빛 (1, 1, 1)이 물체의 표면 반사 노란빛을 띤다면 빨강색과 초록색은 반사하고 파란색을 흡수한다. 재질 파라미터를 이용하여 이러한 종류의 필터링이 가능하다. (1, 1, 1) ⊗ (1, 1, 0) = (1, 1, 0) (0.5, 0.5, 0.5) ⊗ (0.5, 1, 0.5) = (0.25, 0.5, 0.25) 𝑠 𝑑 ⊗ 𝑚 𝑑
  • 17.
    Diffuse term  디퓨즈항을 적용한 결과
  • 18.
    Specular term  스펙큘러항은 물체 표면에 하이라이트(highlight)를 만드는데 사용되며 정반사라 부른다.  스펙큘러 항은 계산하기 위해 시야 벡터, 반사 벡터, 빛벡터를 이용한다.
  • 19.
    Specular term -반사벡터-  반사 벡터 유도
  • 20.
    Specular term -시야벡터-  디퓨즈 항이 시야 벡터에 독립적인 반면 스펙큘러 항은 시야 벡터에 의존한다.  하이라이트의 감소되는 정도는 (𝑟 ∙ 𝑣) 𝑠ℎ 로 근사적으로 계산되며, sh는 표면의 반짝임 (shininess)를 의미한다.  완벽히 매끄러운 표면의 경우, sh값은 무한대가 되고 𝜌 = 0일 경우에만 카메라에 보인다.  그렇지 않은 표면에서는, 𝜌가 0일 때 가장 큰 하이라이트가 생기고 𝜌가 커질수록 급격히 감소한다.
  • 21.
  • 22.
    Specular term  스펙큘러항의 최종식은 아래와 같다.  디퓨트 항의 재질과는 달리 스펙큘러 항의 재질 특성은 (0.9, 0.9, 0.9), (0.8, 0.8, 0.8) 등과 같이 회색조(gray-scale)로 표현되는데, 이는 하이라이트가 광원을 띄게 하기 위함이다.
  • 23.
    Ambient term  앰비언트항은 장면 속 물체들로 반사된 빛을 근사적으로 표현한다. 흔히 간접광이 라 부른다.  퐁 모델에서 엠비언트 항은 빛이 물체의 모든 표면에 동일한 광도로 반사된다.
  • 24.
    Emissive term  마지막으로발산광은(emissive light)은 표면 그 자체에서 발산하는 빛을 묘사한다.
  • 25.
    Phong Lighting Model 퐁 모델은 네 개 항을 더하여 다음과 같이 정의된다.
  • 26.
    Shader  쉐이더는 GPU에서실행가능한 프로그램을 의미하여, 프로그래머가 제어 할 수 있다.
  • 27.
    쉐이딩 언어  C언어와 매우 유사하다.  Hight Level Shading Launguage(HLSL) by Microsoft  GLSL(OpenGL Shading Language) by OpenGL  벡터와 행렬 같은 특수한 데이터 타입을 지원한다.  입력 데이터의 두가지 종류  Varing data: 쉐이더를 실행할 때마다 변하는 데이터(예 : 버텍스)  Uniform data : 다수의 쉐이더에서 공유되는 일정한 값(예 : 월드 행렬)
  • 28.
    Per-vertex Lighting  Per-vertexLighting은 버텍스 쉐이더에서 조명을 계산한다.
  • 29.
    Per-vertex Lighting  버텍스쉐이더에서 계산된 조명 값은 래스터 라이져 단계에서 선형 보간되어 픽셀 단위의 값들로 저장된다.
  • 30.
    Per-vertex Lighting 의문제점  하나의 삼각형을 이루는 3개의 버텍스에 하이라이트가 없을 경우, 삼각형 사이에 점 p에 서 하이라이트가 존재해도 Per-vertex Lighting의 결과는 하이라이트가 보이지 않는다. Per-vertex Lighting Per-fragment Lighting 실제 조명
  • 31.
    Per-vertex Lighting 의문제점  이 문제는 카메라가 움직일 때 더욱 두드러져 하이라이트가 없어졌다 갑자기 생기 는 현상이 발생한다.
  • 32.
    Per-fragment Lighting  Per-vertexLight 문제를 해결하기 위해 프래그먼트에서 조명을 계산한다.
  • 33.
    Per-fragment Lighting  픽셀세이더에서 조명을 계산하기 전, 노말 벡터를 반드시 정규화 해야한다. 래스터라 이저 단계에서 보간된 노말 벡터는 일반적 으로 단위벡터가 아니기 때문이다.
  • 34.