首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Compute Shader处理渲染目标

使用Compute Shader处理渲染目标
EN

Stack Overflow用户
提问于 2013-09-13 08:44:45
回答 2查看 3.6K关注 0票数 3

我想使用“渲染目标”作为DirectX 11中的“计算着色”的输入。我只需要在“计算阴影”中读取“呈现目标”,而在我的示例中,我不需要呈现“计算着色”输出(尽管我以后必须在CPU中使用它,并且可能需要在其他“计算着色”传递中处理它)。

我已经看到了一些评论,认为这是可能的,但我似乎找不到任何示例代码,显示如何使用渲染目标( Texture2D)作为一个计算阴影缓冲区在阴影资源视图。我尝试了许多选项,但未能创建计算机着色所需的着色资源视图作为输入。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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和弦的纹理中读取样本:

代码语言:javascript
复制
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() ) );
}
 }

希望这能有所帮助。

票数 2
EN

Stack Overflow用户

发布于 2013-09-15 08:31:18

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18781976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档