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 );

但我得到的只是我发布的黑色和绿色分割图像。为了调试这个,我放置了一些 if 语句,如果 float3 样本中的一个元素是 0.0f 并且所有元素都是 0.0f,则返回颜色!我真的将 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*的包含 only POSITIONNORMALTEXCOORD为延迟传递以及将拓扑更改为,D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP因为我的几何传递使用镶嵌。

这是最终输出:) 在此处输入图像描述

于 2015-07-29T12:26:59.543 回答