2


私は遅延レンダリング/シェーディングを初めて実装しています。自分で解決するのに苦労しているいくつかの問題に遭遇しました:/。

ジオメトリ パスと遅延パスを一緒にレンダリングすると、この奇妙に見える出力が得られますここに画像の説明を入力

トポロジ、入力レイアウトなどを設定する前に、遅延パスの最初に緑色のクリア カラーを使用しています。これが緑色の由来です。ただし、出力画像が半分に分割される理由はわかりません。

ただし、私の主な問題は、レンダー ターゲットをジオメトリ パスからシェーダー リソース ビューとして遅延シェーダーに正常に渡すことです。これは私のジオメトリ シェーダーの結果です ここに画像の説明を入力

それで、私が見た出力画像から判断すると、正しい空間への変換を管理していますか?

ジオメトリ パスで、レンダー ターゲットを設定しました

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 シェーダー リソース ビューに自動的に「コピー」され、後でシェーダーの入力として使用できるようになります。

私を訂正したり、この件に関する私の視野を広げたりしてください。私の問題に関する提案はありますか?ありがとうございました!

4

1 に答える 1

0

私は自分が間違っていたことを理解しました!

黒と緑の分割画像は、不適切なUV 座標を使用した遅延シェーダーでのサンプリングの結果です。単純にジオメトリを再度渡し、そのテクスチャ座標でサンプリングするという間違いを犯しました。

解決策は、非常に単純なクワッドとそれを格納するための新しい頂点バッファーを定義することでした

vertices[0].position = XMFLOAT3( -1.0f,  1.0f, 0.0f );  vertices[0].normal = XMFLOAT3( 0.0f, 0.0f, -1.0f );     vertices[0].texCoord = XMFLOAT2( 0.0f, 0.0f );
vertices[1].position = XMFLOAT3(  1.0f,  1.0f, 0.0f );  vertices[1].normal = XMFLOAT3( 0.0f, 0.0f, -1.0f );     vertices[1].texCoord = XMFLOAT2( 1.0f, 0.0f );
vertices[2].position = XMFLOAT3( -1.0f, -1.0f, 0.0f );  vertices[2].normal = XMFLOAT3( 0.0f, 0.0f, -1.0f );     vertices[2].texCoord = XMFLOAT2( 0.0f, 1.0f );
vertices[3].position = XMFLOAT3(  1.0f, -1.0f, 0.0f );  vertices[3].normal = XMFLOAT3( 0.0f, 0.0f, -1.0f );     vertices[3].texCoord = XMFLOAT2( 1.0f, 1.0f );

クワッドの法線はネガタイズ Z 軸を指しているため、ジオメトリ パスで生成されたテクスチャと同じ向きになります。また、ジオメトリ パスがテッセレーションを使用するため、ID3D11InputLayout*のみを含むPOSITION新しいを作成NORMALTEXCOORD、遅延パスのためにトポロジを に変更しました。D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP

これが最終出力です:) ここに画像の説明を入力

于 2015-07-29T12:26:59.543 に答える