렌더링에는 조명과 음영이 포함되어 있다.
Lighting
- 광원과 물체 특성을 감안하여 정점에서의 빛 세기를 계산
Shading
- 결정된 정점 색을 기준으로 해당 물체 내부 곳곳 마다 색을 부여
Global illumination
- 직접 들어오는 빛과 그림자, 반사 등을 고려함
- Indirect illumination
Local illumination
- 직접 들어오는 빛만 고려하며, 물체에 의한 그림자나 반사되는 빛은 고려하지 않음
Phong Lighting Model
= ambient + diffuse + specular의 조합
- Local illumination이며 위 수식을 보면 주변 다른 물체나 표면과는 상관이 없는 term들임
- 로컬이라서 shadow, refraction effects, mirror effect, indirect illumination 같은 것들은 생성 못함
Global illumination 으로 하려면 위 수식을 어떻게 바꿔야할까?
- 빛의 세기나 방향이 모든 곳에 대해서 적분되서 들어와야 함
- 반사되는 빛은 한 쪽 방향이 아니라 반사된 곳의 점의 색깔을 정할 때 적분이 재귀적으로 들어감
그런데 너무 복잡해져서 나온 것이 Rendering equation
Rendering Equation
- x'점에서 x점까지 도달하는 빛의 세기(Total intensity)에 대한 식
1. Visibility
- g(x, x')은 x와 x'사이의 거리가 d라고 했을 때 그 사이에 물체가 아무것도 없으면 1/d^2이고
물체가 있다면 가려져서 안보일 거라 0이됨
- 거리가 멀어질 수록 잘 안보일 거라서 d가 커질수록 위 값인 visibility는 작아지게 됨
2. Emission
- 자체로 발광하는 것
- x'점에서 x점으로 가는 빛의 세기와 그 주변에서 반사되는 빛이 더해짐
3. Reflection
- 반사 텀인데 위의 Emission이랑 더해져서 Visibility랑 곱해짐 !
- 어떤 점을 기준으로 형성된 반구가 있다고 했을 때 이 점으로 들어오는 빛을 모두 합한 것
여기까지 하면 수식이 이렇게 되고 이게 최종 식임
위 복잡한 식을 풀기 위해 재귀인 I() 텀을 없애면 direct illumination이 됨
지금부터는 계산을 단순화시키기 위한 작업임
Direct Illumination
- Ray tracing
- 광원에서 나오는 빛 중 스크린으로 오는 것만 계산하자
- 근데 그럼 광원에서 나오는 모든 빛에 대해 일일히 계산해야 해서 너무 계산량이 많아지니까 까꾸로 스크린에서 광원으로 도달하는 빛만 계산하자
Ray Tracing
- 광원으로부터 Ray를 쏴서 스크린으로 가는 모든 반사를 계산하는 것
- 그런데 그 많은 Ray의 대부분이 스크린으로 가고 있지는 않아서 비효율적
Indirect Illumination
- Ray casting, Monte-Carlo, Radiosity
Ray Casting
- 역방향으로 스크린의 픽셀로부터 Ray를 쏘는 것
- Ray가 직접 광원에 부딪히는 경우 해당 픽셀의 색은 광원의 색이 됨
- 쐈는데 아무 물체랑도 만나지 않으면 배경색이 됨
- 어떤 면과 만나면 광원까지 연결해서 계산
- Per-pixel processing이라서 프래그먼트 쉐이더에서 계산 가능
Ray Casting 계산
- 첫번째 교점: 픽셀에서 d의 방향으로 간 ray에 부딪힌 물체와의 교점
- 두번째 교점: 첫번째 교점에서 광원까지의 ray (Shadow ray)
Rendering Equation
어떻게 모든 reflect와 refract의 방향을 계산할 것인지?
- Case 1: Sample (1도 단위로 거의 다)
- Case 2: Random shoot (랜덤으로)
- Case 3: Pre-determined shoot (미리 정해진 방향으로)
실제로는 랜덤이 가장 좋고, 몇 개나 할 것인지는 재질에 따라서 다름.
100개도 충분한데 유리 같은 경우는 100만개까지도 함
Monte-Carlo Approach
- 확률적 방법
- 모든 ray를 다 계산하지 않고, 랜덤하게 ray와 reflection을 선택해서 추적 및 계산
Radiosity
- Radiosity는 Ray tracing 에서 엄청난 수의 빛을 추적하고 계산해야한다는 문제를 해결하기 위해 제한된 광선 추적을 하는 알고리즘
- 빛을 확산 반사하는 표면이 있는 장면의 렌더링 방정식을 풀기 위해 finite-element 방법 적용
- 모든 유형의 빛 경로를 처리하는 Monte-Carlo 와 달리 광원을 떠나 일부 확산 반사되는 경로만 설명 (눈에 닿기 전의 횟수)
- Global illumination 임
- 표면에 도달하는 조명은 광원에 직접 오는 것이 아니라 빛을 반사하는 다른 표면에서도 나옴
- 뷰 팩터(폼 팩터)는 각 표면의 일부분의 관계에 대해 계산함
- 움직이는 카메라나 움직이는 조명효과에 대한 것 없이 정적이기 때문에 아쉬움
Reflection Model
1. Blinn-phong Reflection Model
-
기존 Phong 모델을 개선한 것
-
기존 Phong 모델은 반사 벡터 R을 구하기 위해 매번 내적 연산을 해주어야 했음
-
Blinn-Phong 모델의 경우 반사 벡터 R을 사용하는 대신 중간 벡터 H를 사용
-
H는 R보다 더 가볍게 구할 수 있는데, 내적 연산은 Fragment Shader에서 수행되어야 했지만, H를 구하는 계산은 Vertex Shader에서 더 단순하게 수행할 수 있기 때문
2. Cook Torrance Reflection Model
- Phong이나 Blinn 모델과 비교하여 'Enery Conservation'과 'Microfacet'을 도입하여 더욱 물리적인 현상을 기반으로 하는 리얼리티를 가능하게 해주었음
3. Oren Nayar Reflection Model
- 거친 표면에서의 Diffuse를 표현하기 위한 반사 모델
- 관찰자나 빛의 방향 그리고 거칠기 등을 파라미터로 받는 복잡한 함수가 됨
4. Ward Reflection Model
- Anisotropic specular highlight
물체와 빛이 상호작용하는 방식
1. BRDF(Bidirectional reflectance distribution function)
- 어떤 방향으로 반사가 되는지
- BRDF가 바뀌면 재질도 바뀌어보임
2. BTDF(Bidirectional transmittance distribution function)
3. BSDF(Bidirectional scattering distribution function, 혹은 BxDF)
- 이 둘을 합쳐 빛이 재질과 어떻게 상호작용하는지
- BSSRDF 도 있는데 실제 피부같이 안에 들어갔다 나와서 반사되는 것을 나타냄
참고