我想使用“渲染目标”作为DirectX 11中的“计算着色”的输入。我只需要在“计算阴影”中读取“呈现目标”,而在我的示例中,我不需要呈现“计算着色”输出(尽管我以后必须在CPU中使用它,并且可能需要在其他“计算着色”传递中处理它)。
我已经看到了一些评论,认为这是可能的,但我似乎找不到任何示例代码,显示如何使用渲染目标( Texture2D)作为一个计算阴影缓冲区在阴影资源视图。我尝试了许多选项,但未能创建计算机着色所需的着色资源视图作为输入。
最好是一个指向示例代码片段的指针。
发布于 2013-09-16 12:13:17
您的资源确实需要有Shader资源使用模式,才能通过计算着色器:-For、标准呈现目标: D3D11_BIND_SHADER_RESOURCE -For、交换链:交换链描述中的DXGI_USAGE_SHADER_INPUT进行可读性。
然后,您只需创建一个阴影资源视图像往常一样。
它也有可能(在某种程度上),使您的缓冲区也可以直接写入计算机着色器。在这种情况下,标志是D3D11_BIND_UNORDERED_ACCESS或DXGI_USAGE_UNORDERED_ACCESS (请注意,这不适用于多采样纹理)。
下面是一个非常简单的计算着色器,它从UV和弦的纹理中读取样本:
RWStructuredBuffer<float4> rwbuffer;
//Render target previously rendered
Texture2D tex;
//Buffer containing uvs for sampling
StructuredBuffer<float2> uv <string uiname="UV Buffer";>;
SamplerState mySampler : IMMUTABLE
{
Filter = MIN_MAG_MIP_LINEAR;
AddressU = Clamp;
AddressV = Clamp;
};
[numthreads(1, 1, 1)]
void CS( uint3 i : SV_DispatchThreadID)
{
//Read color and write to buffer
rwbuffer[i.x] = tex.SampleLevel(mySampler,uv[i.x],0);
}
technique11 Process
{
pass P0
{
SetComputeShader( CompileShader( cs_5_0, CS() ) );
}
}希望这能有所帮助。
发布于 2013-09-15 08:31:18
从纹理创建着色器资源视图的第一个要求是使用好的标志创建纹理。旗子是D3D11_BIND_SHADER_RESOURCE。在调用CreateTexture2D之前,必须在decription绑定成员中设置它。
如果呈现目标不是由您创建的,而是从交换链创建的,则不能将其绑定为SRV。您将需要一个中间帧缓冲区,并将其复制到帧末尾的后台缓冲区。
https://stackoverflow.com/questions/18781976
复制相似问题