繁体   English   中英

使用Compute Shader处理渲染目标

[英]Use Compute Shader to Process the Render Target

我想将渲染目标用作DirectX 11中的Compute Shader的输入。我只需要读取Compute Shader中的Render Target,就我而言,我不必渲染Compute Shader输出(尽管我确实有以便稍后在CPU中使用它,并且可能需要在其他Compute Shader传递中对其进行处理。)

我已经看到有评论认为这样做是可行的,但是我似乎找不到任何示例代码来显示如何在“着色器资源视图”中将渲染目标(Texture2D)用作计算着色器缓冲区。 我尝试了许多选项,但是无法创建计算机着色器需要作为输入的着色器资源视图。

最好指向示例代码片段的指针。

您的资源确实需要具有可通过计算着色器读取的着色器资源使用模式:-对于标准渲染目标:D3D11_BIND_SHADER_RESOURCE-对于交换链:交换链描述中的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() ) );
}
 }

希望能有所帮助。

从纹理创建着色器资源视图的第一个要求是创建带有良好标记的纹理。 标志是D3D11_BIND_SHADER_RESOURCE 在调用CreateTexture2D之前,必须在解密绑定成员中设置它。

如果渲染目标不是您创建的,而是由交换链创建的,则您不能将其绑定为SRV。 您将需要一个中间帧缓冲区,并将其复制到帧末尾的后台缓冲区。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM