CubeSky
그럼 지금 이걸갖고 어떤걸 만들 수 있을까?
물론 각 면이 다른 오브젝트를 만들 수 있겠지만, 이걸 많이 사용하는 곳은 Sky다.
게임을 하면 아무리 움직여도 환경은 움직이지 않다.
만드는 방법은 간단하다 저 오브젝트를 카메라를 따라다니게 하면 된다.
그런데 지금까지 두르기 순서를 생각하면서 렌더링을 했다. 그런데 카메라를 따라다니면 카메라에서 저 오브젝트가 안보인다. 두르기 순서가 반대이기 때문이다.
그러면 쉐이더에서 그걸 반대로 뒤집어 주면 된다.
CubeSky.fx
RasterizerState FrontCounterClockWise_True
{
FrontCounterClockWise = True;
};
technique11 T0
{
pass P0
{
SetRasterizerState(FrontCounterClockWise_True);
SetVertexShader(CompileShader(vs_5_0, VS()));
SetPixelShader(CompileShader(ps_5_0, PS()));
}
}
이 함수는 지금까지 시계방향으로 그려줬던 것을 반대로 시계 반대방향으로 그려주는 함수이다.
이렇게 하고,
CubeSky.cpp
void CubeSky::Update()
{
Vector3 position;
Context::Get()->GetCamera()->Position(&position);
sphere->Position(position);
}
매 프레임마다 카메라를 따라다니게 하면
주면 환경이 만들어지긴 했는데 주면 오브젝트가 안보인다……
무슨 일인고 하니 간단하다 그냥 저 오브젝트에 가려저서 안보이는거다.
해결 방법은 Depth를 설정하는 방법이다.
DepthBuffer가 있긴 하지만, 이건 나중에 배우고 깊이에 따라 그려줄지 안그려줄지 이 상황만 설정하는것이다.
깊이에 따라 안그려주면 그냥 그린뒤 다시 켜주면 그때부터 깊이에 따라 그려주고 다시 꺼주면 반복이다.
이걸 생각하면 Sky를 그릴때 Depth를 꺼주고 오브젝트 그릴때 켜주면 된다.
CubeSky.fx
DepthStencilState DepthEnable_False
{
DepthEnable = false;
};
technique11 T0
{
pass P0
{
SetRasterizerState(FrontCounterClockWise_True);
SetDepthStencilState(DepthEnable_False, 0);
SetVertexShader(CompileShader(vs_5_0, VS()));
SetPixelShader(CompileShader(ps_5_0, PS()));
}
}
DepthEnable_False 이걸로 꺼주게 되면
잘 나온다.