D3D를 공부하며 조명효과를 배우기 시작하여 관련 내용을 정리하고자 합니다.
가장 기본적으로 사용되는 조명 모델인 Phong Reflection(이하 퐁 모델) 그리고 퐁 모델을 위해 필요한 기본 모델들에 대하여 알아보도록 합니다.
우선 퐁 모델을 위해서는 기본적인 3개의 모델이 필요합니다.
- Ambient
- Diffuse
- Specular
Shaders 필터의 hlsl 파일의 PS 코드를 참조 합니다.
float4 PS(PixelInput input) : SV_TARGET
{
//world space light
float3 light = normalize(-float3(1, -1, 1)); // 빛의 방향 벡터
//world space normal
float3 normal = normalize(input.Normal); // 월드 좌표의 법선
float diffuse = saturate(dot(light, normal)); // 디퓨즈
float ambient = 0.3f; // ambient 방출강도
float3 lambert =(diffuse + ambient) * input.Color.rgb; // lambert, 밝기 휘도단위
float3 Reflect = reflect(normalize(float3(1, -1, 1)), normal); // 반사 reflect() 함수사용, 빛의방향
float3 viewDir = normalize(ViewPos.xyz - input.wPosition); // 시야(카메라)방향, Camera.cpp 에 필요해서 추가한부분 있음
float3 specular = pow(saturate(dot(Reflect, viewDir)), 20.0f) * float3(1, 1, 1); // 반사된 빛, 하이라이트
//return ambient; // 컬러값없이 ambient 효과만 확인
//return diffuse; // 컬러값없이 diffuse 효과만 확인
//return float4(specular, 1); // 컬러값없이 specular 효과만 확인
return float4(lambert + specular, 1); // 모든효과를 적용시킨 Phong Reflection
}
1. Ambient Reflection
Ambient는 광원 외에 주변 물체가 방출(반사)하는 빛이 관찰자가 보는 물체에 반사되어 관찰자에게 색을 전달합니다.
표면에 반사되어 물체의 색에 영향을 주는 빛을 모델링하며 게임 그래픽에서는 환경광을 상세히 계산하는 대신 일정한 상수로 취급하여 globla illumination을 근사적으로 구현 합니다.
결과 광원과 관계없이 개체의 모든 정점에 같은 색을 비추므로 통일된 색상의 형태로 구현이 됩니다.
주변 반사인 Ambient는 가장 간단한 조명 모델 이라고도 합니다.
표현 식은 아래와 같습니다.
ka는 표면에서 반사되는 주변광의 양인 주변 반사 계수, Ia는 전역 주변 조명
추가적으로 반사의 법칙(law of reflection) 에 대하여 정리 합니다.
위의 이미지를 기준으로 반사 벡터는 N에 대하여 L을 미러링(반사)하여 계산됩니다.
L, N모두 정규화(Normalize) 되며 N에대한 L의 투영은 Ncosθ(N코사인 세타) 입니다.
벡터를 통해 합동 삼각형으로 S=Ncosθ -L, R = 2Ncosθ -L 이 됩니다.
여기서 cosθ를 NL로 대체하여 R=2N(NL)-L 이 됩니다.
복잡해 보이지만 하나하나 천천히 보도록 합니다.
2. Diffuse Reflection
Diffuse는 물체의 표면 재질이 거칠다면 입사된 빛은 여러 방향으로 불규칙하게 반사될 것이지만 이를 렌더링 시스템에서 모두 계산하지 않고 단순 근사 모델을 사용하여 표현합니다. 광원과 표면에서의 법선 벡터의 사이각 세타(θ)에 대한 코사인(cos)값으로 빛의 세기를 결정합니다. 90도를 넘어가는 cos 값은 음수이므로, RGB 시스템을 사용하는 그래픽 시스템은 이 부분을 검정색으로 처리 하여 어둡게 처리 됩니다.
표현 식은 아래와 같습니다.
위의 식에서 N인 경우 L은 아래처럼 정규화 됩니다.
PCN 타입의 PS 계산 결과에서 의도하지 않게 나온 투명? 반사 효과가 흥미로워 서 기록으로 남겨둡니다.
diffuse * input.Color 형식으로 계산이 완료 되었을때 나온 효과
약간 투명한느낌같으면서도 반사되는 느낌으로 보이는데 투명한쪽에 바닥의 회색이아닌 바닥아래 그리드가 비춰지는 이유는 렌더 순서 때문입니다. 플레이어에 상속된 PCN 타입의 쉐이더를 가진 구체는 회색의 바닥보다 먼저 렌더되기 때문이 렌더 당시 바닥이 없음으로 간주되어 먼저렌더되어있던 그리드만이 표현된 상태입니다.
아래는 정상적으로 diffuse가 적용이 된 상태입니다.
3. Specular Reflection
Specular는 반사와 관련되어 있습니다. 특정 방향으로만 반사되는 빛을 표현합니다.
광원의 색이 그대로 관찰자에게 보여지는 하이라이트 효과를 기대할 수 있습니다. 혹은 사물의 재질을 표현이 될 수 있습니다. 예를들어 메탈릭한 느낌을 위해서는 조금더 강한 Specular를 주어 표현이 가능하지만 나무표면과같은 매트한 느낌을 위해서는 Specular를 감소 시켜야 합니다.
즉, 하이라이트 지점에 맺히는 빛을 표현하는 것 입니다.
하이라이트는 이상적인 방사 방향으로 나타나며 디퓨즈와 달리 뷰의 방향이 중요합니다.
위의 1. Ambient Reflection 내용 하단의 반사의 법칙에 반사지수로 n을 추가한다면 미러 반사 방정식은 아래와 같습니다.
4. Phong Reflection
Phong Reflection은 위의 효과들을 적절히 조합하여 사용한 조명 효과 입니다.
반사의 법칙에 관한 공식은 아래의 사이트를 참조하였습니다.
'공부 > DirectX3D' 카테고리의 다른 글
[DirectX3D] 환경 맵핑(Environment Mapping) (0) | 2023.08.08 |
---|---|
[DirectX3D] DxTex 큐브맵(CubeMap) 만들기 (0) | 2023.07.29 |
[DirectX3D/ASSIMP] ASSIMP 코드 정리(진행중) (0) | 2023.06.28 |
[DirectX3D/ASSIMP] ASSIMP 구조 (0) | 2023.06.21 |
[DirectX3D] 레이 캐스팅 ( Ray Casting ) & 레이 트레이싱 ( Ray Tracing) (feat.충돌) (0) | 2023.05.31 |
댓글