빛의 연산에 있어서 가장 중요한 요소들인 Material과 Light의 구조에 대한 설명이다. 본 엔진의 셰이더 연산에선 Material과 Light 사이의 계산에 필요한 필드를 일치시켜서 구현해뒀다. Phonn 방식을 사용하는 이 연산 과정에는 uv 좌표를 사용해서 텍스처에 대한 샘플링이 완료되면 그 정보를 바탕으로 각각의 필드들이 가중치의 개념으로 최종 연산에 반영이된다. 가중치는 0~1 사이의 실수 값을 갖는다.
다음은 연산에 사용되는 필드들에 대한 정보다.
| 타입 | 설명 | |
|---|---|---|
| Ambient | float4 | 환경광 연산 |
| Diffuse | float4 | 분산광 연산 |
| Specular | float4 | 광원에 의한 하이라이트 연산 |
추가적으로 확장성과 16바이트 정렬을 고려해 Alpha값을 포함해서 float4로 정의해뒀지만 아직 Alpha값을 사용해서 연산을 수행하는 부분은 없거나 별도의 환경 변수를 사용한다. 예를 들어 후술할 Specular의 경우가 Material 구조체의 Shiness 값을 따로 설정해서 그 투명도를 조절한다. Alpha값을 사용할 수도 안할 수도 있지만 16바이트 정렬을 고려해야하기 때문에 왠만하면 float3로 자료형이 바뀌는 일은 없을 것이다.
광원에 대한 정보를 담고있음. 기본적으로 연산에 필요한 필수적인 정보 이외에도 광원의 종류, 빛의 소멸 임계점, 빛의 세기와 같은 정보가 담겨있다.
| 타입 | 설명 | |
|---|---|---|
| Ambient | float4 | 환경광 연산 |
| Diffuse | float4 | 분산광 연산 |
| Specular | float4 | 광원에 의한 하이라이트 연산 |
| Emissive | float4 | 광원의 영향을 받지 않고 직접 방출하는 색에 대한 연산 |
| Direction | float3 | 빛의 방향 정보. 정규화 되어있지 않음. |
| LightType | int | 빛의 종류 정보. 방향광, |
| 점 광원, 스폿 광원 중 하나. | ||
| FalloffInfo | float2 | 빛이 소멸하는 임계점에 대한 정보. 소멸의 시작 거리와 끝 거리. |
| 방향광에는 적용되지 않음. | ||
| SpotPower | float | 빛의 세기. |
| padding1 | int | 바이트 정렬용. 사용 안함. |
현재는 Lighting에 관련된 부분만 hlsl 파일을 분리해서 작성 중이지만 앞으로의 개발에 있어서 구조가 크게 개편될 예정이다. 극단적으로는 각 셰이딩 과정 별로 파일을 분할해서 관리할 생각도 있다. 때문에 아직 확실하게 파일 구조가 정립되지 않아 구조에 대한 서술은 생략한다. 후에 파일 구조가 정립되면 내용 갱신이 이루어질 예정.
일반적인 VS와 비교해서 특별한 기능을 하지는 않음. Bone 데이터가 있는 Skinned Mesh의 경우에는 Bone 데이터를 반영한 가중치를 계산해서 적용하도록 설계되어있음.
빛 연산과 관련되서 가장 주요한 계산을 수행하는 부분. Ambient, Diffuse, Specular, Emissive로 크게 나눠 4단계에 걸쳐 연산을 수행한다.
환경광과 관련된 연산을 진행한다. 특별히 복잡한 연산은 진행되지 않는다. Light와 Material의 Ambient값을 연산한 가중치 값을 텍스처 샘플링을 통해 나온 픽셀 값에 적용시키는 과정이다. 다음은 Ambient 연산의 hlsl 코드부분이다.