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

use*_*886 4 c++ hlsl directx-11 vertex-shader

假设我有一个带有常量缓冲区的HLSL顶点着色器片段:

cbuffer matrixBuffer 
{
    matrix worldMatrix;
    matrix viewMatrix;
    matrix projectionMatrix;
};

cbuffer matrixBuffer2
{
    matrix worldMatrix2;
    matrix viewMatrix2;
    matrix projectionMatrix2;
};
Run Code Online (Sandbox Code Playgroud)

来自常量缓冲区的变量然后用于acctual vs function,所以我需要设置它们.

在C++中,我声明了以下结构:

struct MatrixType
{
    D3DMATRIX world;
    D3DXMATRIX view;
    D3DXMATRIX projection;
};
Run Code Online (Sandbox Code Playgroud)

在我初学者的应用程序中,我创建了常量缓冲区指针ID3D11Buffer*.

稍后在每帧方法我更新常量缓冲区,即i映射缓冲区,更新子资源,unmap缓冲区和顶点着色器中的设置缓冲区.

当我只有一个常量缓冲区时,一切都很好,但这是我的问题.

directx如何在缓冲区之间进行区分?例如我想设置worldMatrix2如何实现这一目标?

我读了msdn参考但我没有回答.

是否允许具有两个或更多具有相同大小和元素的常量缓冲区?它们是否存储在连续的内存中,所以当我设置缓冲区时,它们是按HLSL声明的顺序设置的?

gar*_*eek 11

您可以在着色器程序中指定每个常量缓冲区绑定到哪个常量寄存器,如下所示:

cbuffer matrixBuffer : register(b0)
{
    matrix worldMatrix;
    matrix viewMatrix;
    matrix projectionMatrix;
};

cbuffer matrixBuffer2 : register(b1)
{
    matrix worldMatrix2;
    matrix viewMatrix2;
    matrix projectionMatrix2;
};
Run Code Online (Sandbox Code Playgroud)

将常量缓冲区绑定到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
Run Code Online (Sandbox Code Playgroud)

来自MSDN:

void VSSetConstantBuffers(
    [in]  UINT StartSlot,   <-- this is the slot parameter
    [in]  UINT NumBuffers,
    [in]  ID3D11Buffer *const *ppConstantBuffers
);
Run Code Online (Sandbox Code Playgroud)

在您的示例中,您可以选择(因为两个缓冲区具有相同的结构).您可以维护两个单独的常量缓冲区并单独更新每个缓冲区,或者您可以重复使用相同的常量缓冲区并每帧更新一次.在这种情况下,您将使用map子资源等进行更新.执行着色器,然后使用map子资源再次更新缓冲区,然后再次执行着色器.