-
12. 조명Software/DirectX 2024. 5. 24. 09:53728x90
Table of Contents
1. 빛과 재질의 상호작용
1.1 재질(material)
1.2 국소 조명 모형(local illumination model)
1.3 전역 조명 모형(global illumination model)
2. 법선 벡터(Normal Vector)
2.1 정점 법선 평균 기법(vertex noraml averaging)
2.2 변환행렬 적용 법선 벡터
3. 빛 벡터(light vector)
4. 람베르트 코싸인 법칙
5. 분산 조명(diffuse reflection)
6. 주변 조명(Ambient light)
7. 반영 조명(Specular reflection)
8. 프레넬 효과(Fresnel effect)
9. 셰이더에서의 빛 계산1. 빛과 재질의 상호작용
- 이 전까지의 공부에서는 정점의 색상을 사용자가 직접 RGB값을 설정해주어 결정했다
- 조명이 들어가면 직접 색상이 결정되는 것이 아닌 표면의 재질과 빛을 지정하고 조명 방정식을 이용해서 색상을 결정하게 된다.
1.1. 재질(material)- 재질은 빛이 물체 표면과 상호작용하는 방식을 결정하는 속성들의 집합이다.
- 반사 , 흡수하는 빛의 색상, 재질의 굴절률, 매끄러운 정도, 투명도 등이 포함되어 있다.
- 광원을 받은 재질이 반사하는 RGB값을 관찰자의 눈 속 광수용세포를 적절하게 자극하여 색상을 인식하게된다.
- 즉 재질이 반사하는 빛의 세기에 따라 표면의 색상이 결정된다.
- 국소 조명 모형에서는 각 물체를 다른 물체와는 독립적으로 처리하며,
- 물체간의 반사광은 고려하지 않고 광원에서 직접 방출된 빛만 다룬다.
- 국소 조명 모델의 문제점은 광원과 물체 사이의 장애물이 있어도 인식하지 못하고 빛이 통과된다는 점이다.
- 전역 조명 모형에서는 물체간의 반사된 간접광 까지 모두 고려한다
- 실시간 렌더링을 해야하는 게임에서는 비용이 너무 크므로 사용하기 어렵다.
- 하지만 그래픽카드가 고성능화 되면서 최근 연구가 진행되고있다. (Ray-tracing, Radiosity 기법 등)
- 확실하게 사실적인 그래픽 묘사가 가능하다.
- 반사가 없는 재질에는 local만 적용하고 금속 등 반사가 확실한 물체에 대해서는 반사각을 계산해놓고 구현하는 방법도 종종 사용된다.
2. 법선 벡터(Normal Vector)
- 면 법선(face normal)은 다각형 모든 점에 수직인 벡터이다.
- 표면 법선(surface noraml)은 표면 한 점의 접평면(tangent plane)에 수직인 단위벡터이다.
- 조명 계산을 하기 위해서는 삼각형 메시 표면의 모든 점에서 표면 법선이 필요하다.
- 표면 법선으로 들어온 광선의 입사각을 구할 수 있다.
- D3D에서는 래스터라이징 과정에서 정점 보간을 통해 표면 법선들을 생성해낸다.
2.1. 정점 법선 평균 기법(vertex noraml averaging)
- 메시 임의의 정점의 법선 벡터를 그 점을 공유하는 다각형들의 면 법선의 평균으로 근사
- 법선들의 평균은 곧 법선들의 합을 정규화한 단위벡터이다.
- 다각형의 면적이 큰 벡터를 가중치를 더 주는 가중 평균 기법을 사용할 수도 있다.
2.2. 변환행렬 적용 법선 벡터
- 임의의 벡터 V에 수직인 n이 있을 때, 변환행렬 A를 곱하면 VA와 nA는 더 이상 수직이 아님.
- 따라서 변환행렬적용 시에도 변함이 없는 법선벡터 n의 계산이 필요하다.
tip
- 조명 계산은 픽셀 쉐이더에서 픽셀 단위로 이루어진다. 하지만 조명 계산을 정점 단위로 하면 조명이 덜 정확하지만 비용이 훨씬 싸다. - 픽셀 쉐이더의 연산을 정점에서 실행하는 것은 품질을 희생해서 속도를 올리는 최적화 기법의 기본이다. - 품질 차이가 많이 나지 않는다면 매력적인 선택이 될 것이다.
3. 빛 벡터(light vector)
- 일반적으로 게임 프로그래밍에서 사용하는 빛 벡터는 광원에서 물체까지가 아닌, 물체부터 광원까지의 벡터를 일컫는다
- 물체부터 광원까지의 벡터와 , 물체의 법선벡터 사이의 각 세타를 이용해 반사각을 계산할 수 있다
- hlsl 내장함수 reflect에서 이 반사각을 계산하는 공식을 제공한다.
4. 람베르트 코싸인 법칙
- 표면의 한 영역이 받는 빛의 양을 결정하는 복사조도(irradiance)를 구하는 공식
- 빛의 수직인 면적의 복사조도에 cos세타를 곱한 값으로 계산한다.
- 빛이 표면의 뒤를 비추는 경우 음수처리를 피하는 처리를 해야함
5. 분산 조명(diffuse reflection)
- 물체 표면에서 흡수된 나머지 빛이 표면 바깥으로 나와 모든 방향으로 흩어지는 분산반사(diffuse)를 계산한 조명.
- 분산반사는 시점에 독립적이다. 시점의 위치에 상관없이 눈에 도달함
- 분산 반사율(Diffuse albedo)과 분산광의 세기의 곱으로 분산된 반사 빛이 계산된다.
- 반사된 빛에 람베르트 코사인 법칙으로 각도 계산을 더 해주면 정확한 분산 조명값이 된다.
- BL은 입사광의 양, Md는 분산 반사율, L은 빛 벡터, n은 표면 법선이다
Cd = max(L*n, 0)* BL * Md
6. 주변 조명(Ambient light)
- 광원으로부터 직접 닿는 조명 이외에 다른 물체에 반사된 간접광을 고려한 조명
- 게임 프로그래밍에서는 정확한 계산이 아닌 근사값으로 계산하는 것이 일반적이다
Ca = AL * Md
- 여기서 AL은 전체 주변광의 세기이고, Md는 앞서 나온 분산 반사율이다.
- 주변광에 의해 물체는 전체적으로 조금씩 밝게 만들어진다.
- 주변광 계산에는 실질적으로 다른 물리적인 계산이 관여하지 않는다.
7. 반영 조명(Specular reflection)
- 물체의 표면에 빛이 도착했을 때, 매질 안으로 굴절되는 빛을 반영광이라고 한다.
- 반영광이 물체를 통과해서 눈으로 들어오면, 물체가 투명해보인다. (투명한 물체를 통과했을 때 통과함)
- 불투명한 물체의 반영광은 반사각을 따라 분산된다. 따라서 불투명한 물체에서 눈에 도달한 빛의 양은 분산광과 반영광의 조합이다.
Cs = max(L*n, 0) * BL * Rf(ah)* (m+8)/8 (n * h)^m
8. 프레넬 효과(Fresnel effect)
- 빛이 반사되고 굴절되는 양이 시점(입사각)과 재질에 의해 결정되는 현상
- 예를 들어 금속은 투과된 빛을 흡수한다. 금속 자체에는 빛 반사가 없다. 하지만 금속의 재질(Rf)값이 커서 상당한 양의 반영광이 반사되어 금속이 검은 색으로 보이지 않게 되는 것.
9. 셰이더에서의 빛 계산
앞서 설명한 세 가지의 빛 (주변광, 분산광, 반영광)의 합으로 반사된 빛의 세기를 구한다.
- 조명 방정식
LightColor = Ca + Cd + Cs // 주변 + 분산 + 반영 = AL * Md + max(L * n, 0) * BL * (Md + Rf(ah) * (m+8)/8(n*h)^m)
- L : 광원을 향하는 빛 벡터이다
- n : 표면 법선 이다
- h : 빛벡터와 시점 벡터의 중간 벡터이다.
- AL : 입사 주변광의 양이다
- BL : 입사 직접광의 양이다
- Md : 분산 광의 양이다.
- L * n : 람베르트 코사인 법칙이다
- ah : 중간벡터와 빛벡터 사이의 각도이다
- Rf(ah) : 프레넬 효과에 의해 반사되어 눈에 도달한 반영광의 양이다.
- m : 표면 거칠기이다
- (n*h)^m : 거시 법선 n과 각도가 h세타인 법선 h를 가진 미세면의 비율이다
- (m+8) / 8 : 반영 반사에서 에너지 보존을 위한 정규화 계수이다.
728x90'Software > DirectX' 카테고리의 다른 글
14. 텍스쳐 ( Texture ) (0) 2024.05.24 13. 빛 (0) 2024.05.24 11. D3D 그리기 연산2 (0) 2024.05.24 10. D3D 그리기 연산 (0) 2024.05.24 9. D3D 실제 구현 (0) 2024.05.24