假设我有一个带有常量缓冲区的HLSL顶点着色器片段:
cbuffer matrixBuffer
{
matrix worldMatrix;
matrix viewMatrix;
matrix projectionMatrix;
};
cbuffer matrixBuffer2
{
matrix worldMatrix2;
matrix viewMatrix2;
matrix projectionMatrix2;
};
来自常量缓冲区的变量然后用于acctual vs function,所以我需要设置它们。
在C ++中我声明了struct:
struct MatrixType
{
D3DMATRIX world;
D3DXMATRIX view;
D3DXMATRIX projection;
};
在初学者的应用程序中,我创建了常量缓冲区指针ID3D11Buffer *。
稍后每帧方法我更新常量缓冲区,即i map buffer,update subresource,unmap buffer和vertex shader中的set buffer。
当我只有一个常量缓冲区时,一切都很好,但这是我的问题。
directx如何在缓冲区之间进行区分?例如,我想设置worldMatrix2如何实现这个目标?
我读了msdn参考但我没有回答。
是否允许两个或更多具有相同大小和元素的常量缓冲区?它们是否存储在连续的内存中,所以当我设置缓冲区时,它们是按HLSL声明的顺序设置的?
答案 0 :(得分:10)
您可以在着色器程序中指定每个常量缓冲区绑定到哪个常量寄存器,如下所示:
cbuffer matrixBuffer : register(b0)
{
matrix worldMatrix;
matrix viewMatrix;
matrix projectionMatrix;
};
cbuffer matrixBuffer2 : register(b1)
{
matrix worldMatrix2;
matrix viewMatrix2;
matrix projectionMatrix2;
};
当您将常量缓冲区绑定到c ++代码中的顶点着色器时,您可以指定要绑定到哪个槽,如下所示:
// Set the buffers.
g_pd3dContext->VSSetConstantBuffers( 0, 1, &g_pConstantBuffer1 ); // Bind to slot 0
g_pd3dContext->VSSetConstantBuffers( 1, 1, &g_pConstantBuffer2 ); // Bind to slot 1
来自MSDN:
void VSSetConstantBuffers(
[in] UINT StartSlot, <-- this is the slot parameter
[in] UINT NumBuffers,
[in] ID3D11Buffer *const *ppConstantBuffers
);
在您的示例中,您可以选择(因为两个缓冲区具有相同的结构)。您可以维护两个单独的常量缓冲区并单独更新每个缓冲区,或者您可以重复使用相同的常量缓冲区并每帧更新一次。在这种情况下,您将使用map子资源等进行更新。执行着色器,然后使用map子资源再次更新缓冲区,然后再次执行着色器。
答案 1 :(得分:0)
相同的原则是在着色器中绑定着色器资源视图,也许这篇文章也会对你有帮助: DirectX Shader Resource View in Shaders