我第一次遇到一些我自己无法解决的问题时,我正在实施延迟渲染/着色:/。
当一起渲染几何通道和延迟通道时,我得到了这个看起来很奇怪的输出
在设置拓扑、输入布局等之前,我在延迟传递的开头使用了绿色透明色。这就是绿色的来源。我不确定为什么输出图像被分成两半。
然而,我的主要问题是成功地将渲染目标从我的几何传递作为着色器资源视图传递到我的延迟着色器。这是我的几何着色器的结果
所以从输出图像来看,我已经看到将转换管理到正确的空间,对吗?
在我的几何传递中,我设置了我的渲染目标
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 );
但我得到的只是我发布的黑色和绿色分割图像。为了调试这个,我放置了一些 if 语句,如果 float3 样本中的一个元素是 0.0f 并且所有元素都是 0.0f,则返回颜色!我真的将 gbuffer 渲染目标设置为着色器资源视图吗?
我的理解是,当 gbuffer 包含一个 ID3D11ShaderResourceView* 和一个 ID3D11RenderTargetView* 并且用于创建两者的 ID3D11Texture2D* 时,是使用D3D11_BIND_RENDER_TARGET |创建的。D3D11_BIND_SHADER_RESOURCE绑定标志,当使用渲染目标视图时,其内容会自动“复制”到 gbuffer 着色器资源视图,稍后可用作着色器的输入。
随时纠正我和/或拓宽我对该主题的视野。对我的问题有什么建议吗?谢谢!