Mesh와 Texture에 대해 공부하고 나서 그 두가지의 응용 예제로 제시된 것이 CubeMap이다.
Texture에도 여러 종류가 있는데 Texture1D, Texture2D, Texture3D = Texture2DArray, TextureCube 등,
이 중 TextureCube는 2D 6장으로 이루어진 텍스쳐 객체로 X,Y가 방향을 가르키는 값으로 이루어진다.
먼저 6면체 큐브에 텍스쳐를 입히는 과정을 먼저 해본다.
이전에 생성한 CubeMesh에 D3DX11CreateShaderResourceViewFromFile() 함수를 통해 외부에 저장한 텍스쳐 파일을 큐브에 입힌다. 다음은 큐브맵에 쓰이는 .fx 파일의 코드다.
VertexOutput VS(VertexTextureNormal input)
{
VertexOutput output;
output.oPosition = input.Position.xyz;
output.Position = WorldPosition(input.Position);
output.Position = ViewProjection(output.Position);
output.Normal = WorldNormal(input.Normal);
return output;
}
float4 PS(VertexOutput input) : SV_Target
{
return CubeMap.Sample(LinearSampler, input.oPosition) * 1;
}
이렇게 6면체 큐브에 텍스처를 입힌 결과물이다.
이어서 큐브 메쉬만 원으로 바꾼 결과물이다.
간단히 말하자면 위에 그려낸 텍스쳐를 입힌 메쉬를 크기를 키워 카메라가 비추는 방향에서 보이게끔 하는것이다.
그런데 여기서 2가지 문제가 발생하는데, 한 가지는 카메라가 결과적으로 커진 메쉬를 '안'에서 바라보기 때문에 메쉬의 뒷면을 바라본다는 것이고, 한 가지는 게임적으로 바라볼 때 외곽의 맵은 가장 먼저 렌더링 되기 때문에 Depth 순서상 UI를 가릴 수 있다는 것이다.
두 가지 문제를 해결하는 ResterizerState, FrontCounterClockwise = True 설정으로 그려지는 정점 방향을 시계방향에서 반시계로 바꿔 거꾸로 그리고 DepthStencilState, DepthEnable = false 설정을 이용해 큐브맵에 한하여 깊이 설정을 제거하고 가장 먼저 렌더링해 다른 요소들을 가리지 않도록 한다.
technique11 T0
{
// 패스를 통해 Resterizer와 DepthStencil 설정을 지정한다.
P_RS_DSS_VP(P0, FrontCounterClockwise_True, DepthEnable_False, VS, PS)
}
설정을 마치고 큐브메쉬의 크기를 키워 카메라를, 월드를 덮어주면 바라던 대로 배경화면처럼 보여지게 된다.
Model(1) - 기초 설명 (1) | 2024.10.10 |
---|---|
Mesh(1) - 원기둥, 원 (0) | 2024.07.31 |
Terrain(2) - Normal 값을 통한 음영 (1) | 2024.07.18 |
Terrain(1) - 높이 설정 (0) | 2024.07.18 |
Texture(3) - 좌표지정모드 (0) | 2024.07.11 |