この質問は、私が尋ねた以前の質問に関連しています。
レンダリングしている平らな正方形のメッシュに一連の 48 のテクスチャがあり、それらがすべて結合して 1 つの「シーン」を形成します。それらはそれぞれ、1 つまたは 2 つの小さな画像を含む透明度の割合が高く、並べるとシーン全体を見ることができるはずです。これで問題なく動作すると思っていたのですが、テストしてみると、一番上のテクスチャが見えて、透明になるところはどこでもクリアな色になっていました。
最初は、画像の読み込み方法に問題があり、どういうわけかアルファを無効にしていると思いましたが、クリアカラーをいじってみると、透明度があることに気付きました。
次に、ブレンディングを有効にしてみました。これは、すべてのテクスチャが 1 つの z 平面で結合される場合に機能します。
上記にリンクした質問に、画像の読み込みとブレンディングのコードを投稿しました。
現在、深度バッファの問題である可能性があると考え始めているため、ウィンドウに依存するリソースに次のコードを追加しました。
Microsoft::WRL::ComPtr<ID3D11DepthStencilState> DepthDefault;
D3D11_DEPTH_STENCIL_DESC depthstencilDesc;
ZeroMemory(&depthstencilDesc, sizeof(depthstencilDesc));
depthstencilDesc.DepthEnable = FALSE;
depthstencilDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
depthstencilDesc.DepthFunc = D3D11_COMPARISON_ALWAYS;
depthstencilDesc.StencilEnable = FALSE;
depthstencilDesc.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP;
depthstencilDesc.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
depthstencilDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
depthstencilDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
depthstencilDesc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP;
depthstencilDesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
depthstencilDesc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
depthstencilDesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
DX::ThrowIfFailed( direct3d.device->CreateDepthStencilState(&depthstencilDesc, DepthDefault.GetAddressOf() ) );
direct3d.context->OMSetDepthStencilState(DepthDefault.Get(), 0);
このコードでも、最上位レイヤーしか表示されません。何か不足していますか、それとも設定が間違っていますか?
編集:問題を視覚化するために、すべて同じサイズの 48 枚のガラス板があり、それらがすべて一列に並んでいるように見えます。ガラスの各部分には、そのどこかに 1 つのイメージがあります。すべてのガラス板を通して見ると、すべての小さな画像が組み合わされた 1 つの特別な画像が得られます。私にとって、directx またはピクセル シェーダーは最初のガラス ペインのみを描画し、最初のペインのすべての透明度をクリア/背景色で塗りつぶします。
編集: depthstencilview を作成するために使用しているコード:
CD3D11_TEXTURE2D_DESC depthStencilDesc( DXGI_FORMAT_D24_UNORM_S8_UINT, backBufferDesc.Width, backBufferDesc.Height, 1, 1, D3D11_BIND_DEPTH_STENCIL );
ComPtr<ID3D11Texture2D> depthStencil;
DX::ThrowIfFailed( direct3d.device->CreateTexture2D( &depthStencilDesc, nullptr, &depthStencil ) );
auto viewDesc = CD3D11_DEPTH_STENCIL_VIEW_DESC(D3D11_DSV_DIMENSION_TEXTURE2D);
DX::ThrowIfFailed( direct3d.device->CreateDepthStencilView( depthStencil.Get(), &viewDesc, &direct3d.depthStencil ) );
そのコードは文字通り、深度テスト/ D3D11_DEPTH_STENCIL_DESC コードのすぐ上にあります。これにより深度コードが作成されると思います。