c++ - 如何创建具有有效维度的常量缓冲区

标签 c++ shader direct3d hlsl direct3d11

晚上好

我正在尝试将 XMFLOAT3X3 发送到常量缓冲区(请参阅下面的代码)。

ZeroMemory(&constDesc, sizeof(constDesc));
constDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
constDesc.ByteWidth = sizeof(XMFLOAT3X3);
constDesc.Usage = D3D11_USAGE_DEFAULT;

result = m_pDevice->CreateBuffer(&constDesc,0,&m_pTexTransformCB);

if (FAILED(result)) {
    MessageBoxA(NULL,"Error creating constant buffer m_pTexTransformCB", "Error", MB_OK);
    return false;
}

但是编译器告诉我 XMFLOAT3X3 是常量缓冲区字节宽度的无效维度:

D3D11: ERROR: ID3D11Device::CreateBuffer: The Dimensions are invalid. For ConstantBuffers, marked with the D3D11_BIND_CONSTANT_BUFFER BindFlag, the ByteWidth (value = 36) must be a multiple of 16 and be less than or equal to 65536. [ STATE_CREATION ERROR #66: CREATEBUFFER_INVALIDDIMENSIONS ]

但是,我是 HLSL 的新手,所以我不确定如果我将字节宽度设置为 48,着色器的 cbuffer 中的 float3x3 是否会正确注册。我应该如何最好地处理这个问题?

如果您需要更多信息,请发表评论,我会编辑问题。我希望它足够清楚。

最佳答案

在您的情况下,您只需将 ByteWidth 更改为 48 就可以了。如果您想将多个值组合在一起,您将需要确保您的数据与 16 字节边界对齐。为此,您只需在定义结构之前添加 __declspec(align(16)) 即可。

__declspec(align(16))
struct Data
{
    XMFLOAT3X3 a;

    //other stuff here
};

这样您就可以使用 sizeof(Data) 并确保您的 ByteWidth 有效。很抱歉之前给你一个错误的答案,你不需要手动填充。

关于c++ - 如何创建具有有效维度的常量缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7521222/

相关文章:

c++ - C++ 中的简单数组求和

javascript - Three.js 自定义着色器

c++ - 如何最好地封装窗口句柄?

opengl-es - OpenGL ES 中的标识符、初始化和局部变量

opengl - 用CG代替GLSL可行吗?

WPF-DirectX 互操作问题(D3DImage)

c++ - Direct3D 发现 2D 屏幕坐标有效,但在受到压力时出现镜像故障

c++ - 没有匹配函数调用 'begin(int [n])'

c++ - g++ 链接问题 : In function `_start' : (. text+0x20): undefined reference to `main'

c++ - 函数级别的 C++ 智能生成文件