gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:10:37 25 4
gpt4 key购买 nike

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

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

cbuffer matrixBuffer2
{
matrix worldMatrix2;
matrix viewMatrix2;
matrix projectionMatrix2;
};

来自常量缓冲区的变量然后在实际与函数中使用,所以我需要设置它们。

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

struct MatrixType
{
D3DMATRIX world;
D3DXMATRIX view;
D3DXMATRIX projection;
};

在我的应用程序初始化时,我创建了常量缓冲区指针 ID3D11Buffer*。

稍后在每帧方法上我更新常量缓冲区,即我映射缓冲区,更新子资源,取消映射缓冲区,并在顶点着色器中设置缓冲区。

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

directx 如何区分缓冲区?例如我想设置 worldMatrix2 如何实现?

我阅读了 msdn 引用资料,但没有得到任何答案。

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

最佳答案

您可以像这样在着色器程序中指定每个常量缓冲区绑定(bind)到哪个常量寄存器:

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

cbuffer matrixBuffer2 : register(b1)
{
matrix worldMatrix2;
matrix viewMatrix2;
matrix projectionMatrix2;
};

当您在 C++ 代码中将常量缓冲区绑定(bind)到顶点着色器时,您可以指定绑定(bind)到哪个插槽,如下所示:

// 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 子资源再次更新缓冲区,然后再次执行着色器。

关于c++ - 两个具有相同元素的常量缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17353351/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com