1

この質問は、私が尋ねた以前の質問に関連しています。

レンダリングしている平らな正方形のメッシュに一連の 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 コードのすぐ上にあります。これにより深度コードが作成されると思います。

4

1 に答える 1

1

深度バッファーを使用して半透明をレンダリングする場合は、頂点をレンダリングする順序を並べ替える必要があると思います。深度バッファを使用したくない場合は、おそらく定義/作成/設定しないでください。

于 2013-02-13T23:39:12.950 に答える