Skybox
Skybox
これはゲームの中の空を表現する方法です.
カメラの可視領域の末端が1であると仮定すると、巨大な立方体が作成され、カメラが挿入されます.
skyboxにカメラを置くと、何の修正もなく、問題が発生します.
プレイヤーがskyboxに近づくとskyboxを通過します.
skyboxに近づくほど、skyに対応するテクスチャが近づきます.
Cullingの反時計回りの頂点は描画されません.カメラはskybox立方体の内部に存在し,カメラの位置からskyboxは反時計回り方向に形成された頂点である.だから描けない.
上記の状況は実際の空とは異なり,いくつかのコード上の修正により実際の空に類似した効果を実現した.
// Translation은 하지 않고 Rotation만 적용한다
float4 viewPos = mul(float4(input.localPos, 0), g_matView);
float4 clipSpacePos = mul(viewPos, g_matProjection);
// w/w=1이기 때문에 항상 깊이가 1로 유지된다
output.pos = clipSpacePos.xyww; // z값을 w로 하여 깊이값을 1로 세팅하겠다는 의미
output.uv = input.uv;
shader->Init(L"..\\Resources\\Shader\\skybox.hlsli",
{ RASTERIZER_TYPE::CULL_NONE, DEPTH_STENCIL_TYPE::LESS_EQUAL });
switch (info.rasterizerType)
{
case RASTERIZER_TYPE::CULL_BACK:
_pipelineDesc.RasterizerState.FillMode = D3D12_FILL_MODE_SOLID;
_pipelineDesc.RasterizerState.CullMode = D3D12_CULL_MODE_BACK;
break;
case RASTERIZER_TYPE::CULL_FRONT:
_pipelineDesc.RasterizerState.FillMode = D3D12_FILL_MODE_SOLID;
_pipelineDesc.RasterizerState.CullMode = D3D12_CULL_MODE_FRONT;
break;
case RASTERIZER_TYPE::CULL_NONE:
_pipelineDesc.RasterizerState.FillMode = D3D12_FILL_MODE_SOLID;
_pipelineDesc.RasterizerState.CullMode = D3D12_CULL_MODE_NONE;
break;
case RASTERIZER_TYPE::WIREFRAME:
_pipelineDesc.RasterizerState.FillMode = D3D12_FILL_MODE_WIREFRAME;
_pipelineDesc.RasterizerState.CullMode = D3D12_CULL_MODE_NONE;
break;
}
switch (info.depthStencilType)
{
case DEPTH_STENCIL_TYPE::LESS:
_pipelineDesc.DepthStencilState.DepthEnable = TRUE;
_pipelineDesc.DepthStencilState.DepthFunc = D3D12_COMPARISON_FUNC_LESS;
break;
case DEPTH_STENCIL_TYPE::LESS_EQUAL:
_pipelineDesc.DepthStencilState.DepthEnable = TRUE;
_pipelineDesc.DepthStencilState.DepthFunc = D3D12_COMPARISON_FUNC_LESS_EQUAL;
break;
case DEPTH_STENCIL_TYPE::GREATER:
_pipelineDesc.DepthStencilState.DepthEnable = TRUE;
_pipelineDesc.DepthStencilState.DepthFunc = D3D12_COMPARISON_FUNC_GREATER;
break;
case DEPTH_STENCIL_TYPE::GREATER_EQUAL:
_pipelineDesc.DepthStencilState.DepthEnable = TRUE;
_pipelineDesc.DepthStencilState.DepthFunc = D3D12_COMPARISON_FUNC_GREATER_EQUAL;
break;
}
これはskybox shaderを調整する部分です.設定値に応じてトリミングルールとカメラの表示範囲を調整します.
上のコードは、カメラの表示範囲1以下のオブジェクトを描画し、時計回りと反時計回りの頂点を同時に描画するように設定されています.
結果
Reference
この問題について(Skybox), 我々は、より多くの情報をここで見つけました https://velog.io/@sansam41/Skyboxテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol