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