私は遅延レンダリング/シェーディングを初めて実装しています。自分で解決するのに苦労しているいくつかの問題に遭遇しました:/。
ジオメトリ パスと遅延パスを一緒にレンダリングすると、この奇妙に見える出力が得られます
トポロジ、入力レイアウトなどを設定する前に、遅延パスの最初に緑色のクリア カラーを使用しています。これが緑色の由来です。ただし、出力画像が半分に分割される理由はわかりません。
ただし、私の主な問題は、レンダー ターゲットをジオメトリ パスからシェーダー リソース ビューとして遅延シェーダーに正常に渡すことです。これは私のジオメトリ シェーダーの結果です
それで、私が見た出力画像から判断すると、正しい空間への変換を管理していますか?
ジオメトリ パスで、レンダー ターゲットを設定しました
ID3D11RenderTargetView* renderTargetsToSet[] = { mGBuffers[0]->RenderTargetView(),
mGBuffers[1]->RenderTargetView(),
mGBuffers[2]->RenderTargetView(),
mGBuffers[3]->RenderTargetView() };
mDeviceContext->OMSetRenderTargets( NUM_GBUFFERS, renderTargetsToSet, mDepthStencilView );
遅延パスでは、それらをシェーダー リソース ビューとして設定しました
ID3D11ShaderResourceView* viewsToSet[] = { mGBuffers[0]->mShaderResourceView,
mGBuffers[1]->mShaderResourceView,
mGBuffers[2]->mShaderResourceView,
mGBuffers[3]->mShaderResourceView };
mDeviceContext->PSSetShaderResources( 0, 4, viewsToSet );
私の遅延シェーダーでは、それらを登録します
Texture2D worldPosTexture : register( t0 );
Texture2D normalTexture : register( t1 );
Texture2D diffuseTexture : register( t2 );
Texture2D specularTexture : register( t3 );
そしてそれらをサンプリングする
float3 worldPosSample = worldPosTexture.Sample( samplerState, input.texCoord ).xyz;
float3 normalSample = normalTexture.Sample( samplerState, input.texCoord ).xyz;
float3 diffuseSample = diffuseTexture.Sample( samplerState, input.texCoord ).xyz;
float3 specularSample = specularTexture.Sample( samplerState, input.texCoord ).xyz;
ジオメトリ パスが与えたのとまったく同じ出力を得るには、次のように記述します。
return float4( worldPosSample, 1.0f );
しかし、私が得たのは、投稿した黒と緑の分割画像だけです。これをデバッグするために、float3 サンプルの要素の 1 つが 0.0f で、すべての要素が 0.0f の場合に色を返す if ステートメントをいくつか入れました。gbuffer レンダー ターゲットをシェーダー リソース ビューとして本当に正しく設定していますか?
私の理解では、gbuffer に ID3D11ShaderResourceView* と ID3D11RenderTargetView* が含まれ、両方を作成するために使用される ID3D11Texture2D* がD3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCEバインド フラグは、レンダー ターゲット ビューが使用されると、そのコンテンツが gbuffer シェーダー リソース ビューに自動的に「コピー」され、後でシェーダーの入力として使用できるようになります。
私を訂正したり、この件に関する私の視野を広げたりしてください。私の問題に関する提案はありますか?ありがとうございました!