在DirectX 11中发送着色器资源到GPU

Sending shader resource to GPU in DirectX 11

本文关键字:资源 GPU DirectX      更新时间:2023-10-16

假设我有一个简单的2D纹理(着色器资源)

ID3D11ShaderResourceView* srvTexture;

和一个默认的(即时的)设备上下文

ID3D11DeviceContext* dc;

现在,我在像素着色器中设置纹理,像这样

ID3D11ShaderResourceView* srvArrayTexture[1];
srvArrayTexture[0] = srvTexture; 
dc->PSSetShaderResources(
0,                 // start slot (not important in this case)
1,                 // nb of views (one texture)
srvArrayTexture);  // my texture as array (because DirectX wants array)

我理解这个过程作为发送实际纹理从RAM内存到GPU内存。我想知道,为什么也有类似的方法,如VSSetShaderResources, GSSetShaderResources等。这是否意味着每个流水线阶段(VS, GS,…)都有自己的GPU内存?

如果我调用

dc->VSSetShaderResources(A);
dc->GSSetShaderResources(A);
dc->PSSetShaderResources(A);

这是否意味着我发送了三次相同的数据?或者我的数据发送概念是低效的?

这三个函数只是将资源缓冲区中的特定资源绑定,而不是复制到不同的着色器(顶点着色器,像素着色器,几何着色器)。资源缓冲区可以在管道的不同阶段被读取。在您的示例中,只有一个"A"缓冲区。然而,与这个缓冲区绑定的着色器都有读取这个缓冲区的权利。