1. 3D Direct Application
1.1 Cube Mapping System
1.1.1 Cube Mapping
- 여섯 장의 Texture를 어떤 좌표계의 좌표축들에 정렬된 입방체의 여섯 면으로 사용
- 입방체 Texture가 축에 정렬, 각 면은 좌표계의 각 주축 방향에 대응, 입방체의 특정 면을 지칭하는 구조체 사용
typedef enum D3D11_TEXTURECUBE_FACE;
- 2차원 Texture와 달리 입방체 맵에서는 한 텍셀을 2차원 Texture 좌표로 지칭X, 3차원 Texture 좌표가 필요
- 원점에서 시작하는 하나의 3D Lookup Vector를 정의
- Lookup Vector의 3차원 좌표가 지칭하는 텍셀은 Lookup Vector가 입방체 맵과 교차하는 곳의 텍셀
TextureCube gCubeMap;
SamplerState samTriLinearSam { Filter = MIN_MAG_MIP_LINEAR; AddressU = Wrap; AddressV = Wrap; };
1.1.2 Environment Mapping
- 수평 시야각과 수직 시야각이 모두 90도인 카메라를 장면의 한 물체를 중심에 둠
- 여섯 가지 좌표축 방향으로 각각 장면을 렌더링하여 이미지로 저장
- 시야각이 90도이므로 여섯 이미지는 주어진 물체에서 본 주변 환경 전체를 담게 됨
- 환경 맵은 환경 매핑을 적용할 각 물체마다 따로 만드는 것이 정석
- 그러나 멀리 있는 배경 정보를 포착하는 용도로 환경 맵 하나만 사용하는 경우도 많음
- 위의 경우 근처에 있는 물체들이 동일한 환경 맵을 공유 가능
- 카메라가 바라보는 축 방향들이 세계 공간 좌표축들과 일치하도록 설정하여 환경 맵 이미지들을 생성
- 세계 공간을 기준으로 환경 맵을 생성, 조회 벡터의 좌표는 환경 맵이 기준으로 한 것과 같은 공간에 존재
- 외부의 3차원 세계 편집기에서 장면을 만들고 그 장면을 미리 여섯 개의 입방체 면 이미지들로 렌더링 가능
ID3DX11EffectShaderResourceVariable* CubeMap;
CubeMap = mFX->GetVariableByName("gCubeMap")->AsShaderResource();
1.2 Sky System
1.2.1 Sky System
- 하늘 Texture를 입힐 기하구조로는 장면 전체를 감싸는 타원체를 사용
- 상자 대신 타원체로 하늘을 표현하면 하늘이 더 평평해서 자연스럽게 보임
- 지평선 멀리 있는 산들과 하늘을 나타내기 위해 타원면에 환경 맵 Texture를 입힘
- 타원체의 표면이 무한히 멀리 있다고 가정
- 세계 안에서 카메라가 어디로 움직이든 하늘 타원체 표면이 가까워지거나 멀어질 일은 없음
- 무한히 멀이 있는 하늘을 구현하는 방법은 세계 공간에서 하늘 타원체 중심을 카메라 위치에 두면 됨
- 위 방법을 사용할 경우, 카메라가 움직이면 하늘 타원체도 움직이므로 동일하게 움직이게 됨
1.2.1.1 Vertex Shader
- 하늘이 항상 먼 평면에 있도록 설정하기 위해 z = w로 설정
- 국소 정점 위치를 입방체 맵 조회 벡터로 사용
VertexOut VS(VertexIn vin)
{
VertexOut vout;
vout.PosH = mul(float4(vin.PosL, 1.0f), gWorldViewProj).xyww;
vout.PosL = vin.PosL;
return vout;
}
1.2.1.2 Pixel Shader
float4 PS(VertexOut pin) : SV_Target { return gCubeMap.Sample(samTriLinearSam, pin.PosL); }
- 깊이 함수를 <=로 설정하여 깊이 버퍼를 1로 지웠다고 할때 정규화된 깊이 값들이 깊이 판정에 실패하지 않도록 설정
DepthStencilState LessEqualDSS { DepthFunc = LESS_EQUAL; };
RasterizerState NoCull { CullMode = None; };
1.3 Mirror Reflection System
1.3.1 Mirror Reflection
- 임의의 물체가 주변 환경을 반사하는 모습을 묘사
- 물체의 표면은 마치 거울처럼 작용, 표면의 점P를 향한 눈은 P에 반사된 환경을 보게 함
- 물체를 렌더링할 때 픽셀별로 반사 벡터를 계산하고, 그것을 이용하여 환경 맵의 텍셀을 추출
if (gReflectionEnabled)
{
float3 incident = -toEye;
float3 reflectionVector = reflect(incident, pin.NormalW);
float4 reflectionColor = gCubeMap.Sample(samAnisotropic, reflectionVector);
litColor += gMaterial.Reflect * reflectionColor;
}
- 한 픽셀의 색이 전적으로 반사된 색으로 결정되는 것은 아님
- 조명 공식을 완전히 새로 만드는 대신, 기존의 조명 공식에 반사항을 도입하는 것이 바람직 함
- 환경 맵에서 추출한 색 & 응용 프로그램이 제어하는 일종의 반사재질을 사용
struct Material { /* ... */ float4 Reflect; };
- 조명 공식에 이러한 반사항을 추가하면 색이 과포화될 가능성이 존재
- 주변광 재질 계수와 분산광 재질 계수를 낮추어 주변광과 분산광이 표면에서 덜 반사되게 만듦
- 환경 맵에서 추출한 색과 통상적인 조명 공식에 의해 계산된 픽셀 색상의 가중 평균을 사용
'C++ Algorithm & Study > Game Math & DirectX 11' 카테고리의 다른 글
[Direct11] 37. 3D Direct Application - Normal Mapping (0) | 2023.06.30 |
---|---|
[Direct11] 36. 3D Direct Application - Dynamic Cube Mapping System (0) | 2023.06.27 |
[Direct11] 34. 3D Direct Application - Picking System (0) | 2023.06.27 |
[Direct11] 33. 3D Direct Application - Instancing & Culling (0) | 2023.06.26 |
[Direct11] 32. 3D Direct Application - Camera (0) | 2023.06.26 |