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

Sending shader resource to GPU in DirectX 11

假设我有一个简单的 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" 的缓冲区。但是,与此缓冲区绑定的着色器都有权读取此缓冲区。