🌏 배경으로 CubeMap 출력하기
게임하면서 맵이 아무리커도 하늘이 안보인적은 없다. 맵을 넘어서서 지면이 사라져도 하늘은 항상 그려졌는데 그 이유는 CubeMap을 그린 구(Sphere)의 위치가 카메라의 위치와 같기 때문이다.
이때 구가 존재하면 밖에서 표면을 바라봤을 때 시계방향으로 구를 바라봤는데, 구의 안에서 구를 바라본다고하면 반시계방향이 된다.
따라서 래스터라이저를 통해 시계방향으로 그리던 순서를 반시계방향으로 그리도록 수정해줘야 한다.
이러한 설정은 쉐이더의 RasterizerState 값을 FrontCounterClockWise_True 로 초기화하여 사용할 수 있다.
래스터라이저를 수정하여 Cube Sky를 배경으로 출력하고 나면, 기존에 출력해놨던 오브젝트들이 배경화면에 가려져 하나도 보이지 않게 된다. 이는 렌더링하는 순서에 의해 Cube Sky가 모든 물체를 가려버린 것이다.
깊이를 순서대로 Texture가 그려져서 깊이를 끄면 Rendering을 Call하는 순서대로 그려진다.
따라서 하늘을 배경으로 출력하고 안에 내용물들이 보이도록 출력하기 위해선 깊이를 끄고 하늘을 먼저 출력하여 하늘이 맨 뒤에서 그려지도록 하고, 나머지는 깊이를 켜고 나머지 물체들을 그려줄 것이다.
(게임 속 UI 같은 경우도, 하늘같은 배경은 깊이를 끄고 하늘을 그리고, 깊이를 켜고 물체들을 그리고, 다시 깊이를 끄고 UI 요소들을 그리는 순서대로 렌더링한다)
이러한 설정은 쉐이더의 DepthStencilState 값을 DepthEnable_False 로 설정하여 렌더링의 깊이갚을 꺼주면 된다.
그럼 성공적으로 Cube Sky 배경과, 기존에 출력하던 오브젝트들을 함께 출력할 수 있다.
![]() |
![]() |
렌더링할 객체들을 초기화할 때, Cube Sky는 깊이 기능을 끄고, 래스터라이저로 반시계방향으로 구를 그리는 CubeSky 쉐이더를 적용하였고, 지구본을 그릴 때 사용하는 CubeMap은 깊이 기능을 켜고, 기존의 시계방향으로 그리는 CubeMap 쉐이더를 적용하였다.
📄 CubeSky.fx
matrix World;
matrix View;
matrix Projection;
TextureCube SkyCubeMap;
struct VertexInput
{
float4 Position : Position;
float2 Uv : Uv;
float3 Normal : Normal;
};
struct VertexOutput
{
float4 Position : SV_Position;
float3 oPosition : Position1; // Original Position
float2 Uv : Uv;
float3 Normal : Normal;
};
VertexOutput VS(VertexInput input)
{
VertexOutput output;
// 방향벡터로 전달 (w = 0)
output.oPosition = input.Position.xyz;
output.Position = mul(input.Position, World);
output.Position = mul(output.Position, View);
output.Position = mul(output.Position, Projection);
output.Normal = mul(input.Normal, (float3x3) World);
output.Uv = input.Uv;
return output;
}
SamplerState LinearSampler
{
Filter = MIN_MAG_MIP_LINEAR;
AddressU = Wrap;
AddressV = Wrap;
};
// 전면이 반시계방향(CounterClock)으로
RasterizerState FrontCounterClockWise_True
{
FrontCounterClockWise = True;
};
// Rendering 깊이 꺼주기
DepthStencilState DepthEnable_False
{
DepthEnable = false;
};
float4 PS(VertexOutput input) : SV_Target
{
return SkyCubeMap.Sample(LinearSampler, input.oPosition);
}
technique11 T0
{
pass P0
{
SetRasterizerState(FrontCounterClockWise_True);
SetDepthStencilState(DepthEnable_False, 0);
SetVertexShader(CompileShader(vs_5_0, VS()));
SetPixelShader(CompileShader(ps_5_0, PS()));
}
}
'🎨DirectX' 카테고리의 다른 글
[DX] 3D 모델, Assimp, ReadFile (0) | 2023.03.13 |
---|---|
[DX] Constant Buffer, Buffer DESC (Usage) (0) | 2023.02.16 |
[DX] CubeMap 렌더링 (0) | 2023.02.14 |
[DX] 구면 좌표계(Spherical Coordinate System) (0) | 2023.02.13 |
[DX] Mesh 부모 클래스, SRT 순서, ID3DX11EffectMatrixVariable, D3DXMatrixRotationYawPitchRoll (0) | 2023.02.07 |