Skybox


Skybox


  • これはゲームの中の空を表現する方法です.

  • カメラの可視領域の末端が1であると仮定すると、巨大な立方体が作成され、カメラが挿入されます.

  • skyboxにカメラを置くと、何の修正もなく、問題が発生します.

  • プレイヤーがskyboxに近づくとskyboxを通過します.

  • skyboxに近づくほど、skyに対応するテクスチャが近づきます.

  • Cullingの反時計回りの頂点は描画されません.カメラはskybox立方体の内部に存在し,カメラの位置からskyboxは反時計回り方向に形成された頂点である.だから描けない.

  • 上記の状況は実際の空とは異なり,いくつかのコード上の修正により実際の空に類似した効果を実現した.
  • skyboxをカメラの可視範囲内で最も遠い位置に描画します.カメラが揺れてもskyboxは可視範囲の遠くに保たれます.
  • Culling規則を調整し、半時計回りの頂点を描画します.
  •     // 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;
    
  • 位置行列をxywwに設定し、深さ値を無条件に1に設定します.
  • すなわち、SkyBoxは常にカメラの可視範囲の末端に存在する.
  • 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以下のオブジェクトを描画し、時計回りと反時計回りの頂点を同時に描画するように設定されています.
    結果