两个具有相同元素的常量缓冲区

时间:2013-06-27 21:16:08

标签: c++ hlsl directx-11 vertex-shader

假设我有一个带有常量缓冲区的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声明的顺序设置的?

2 个答案:

答案 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