如何创建具有有效维度的常量缓冲区
How to create a constant buffer with valid dimension
晚上好
我试图发送一个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 ]
然而,我有点新的hsl,所以我不确定如果我将字节宽度设置为48,在着色器的cbuffer中的float3x3将正确注册。我该如何最好地处理这件事?
如果你需要更多的信息,请评论,我将编辑问题。
在您的情况下,您可以将ByteWidth更改为48,这将是好的。如果希望将多个值组合在一起,则需要确保数据以16字节的边界对齐。要做到这一点,你可以在定义结构之前添加__declspec(align(16))。
__declspec(align(16))
struct Data
{
XMFLOAT3X3 a;
//other stuff here
};
这样你就可以使用sizeof(Data)并保证你的ByteWidth是有效的。我很抱歉之前给了你一个错误的答案,你不需要手动填写。
"如果绑定标志为D3D11_BIND_CONSTANT_BUFFER,则必须设置ByteWidth值为16的倍数"
查看MSDN
相关文章:
- C++字符*缓冲区的大小
- 欧拉项目#8答案是大以获得有效答案
- 找到一种有效的方法,在 2 个巨大的缓冲区上执行 MAX,每字节字节
- GLSL 计算着色器 使用查找表设置缓冲区会导致不写入任何数据,与其他数据设置相同的缓冲区有效
- 将随机数放入缓冲区以写入文件的有效方法是什么?
- 当构建器被销毁时,缓冲区是否有效
- 如何有效地从标准:d创建D3D缓冲区
- 从与对象大小不一致的连续固定大小缓冲区解析对象的有效方法
- 如何有效地确定用于循环的预渲染正弦波音频缓冲区的最小必要大小
- ZeroMQ 的替代方案是什么,用于移动协议缓冲区有效负载
- 如何将最低有效位写入缓冲区
- 连接多个缓冲区的有效方法
- 环形缓冲区的有效边界检查
- 在字符串附加函数中,null终止无符号字符缓冲区的有效方法
- 从空缓冲区构造“std::ostream”是否有效
- 最有效的写缓冲区的方式
- 在c++中重组缓冲区中数据的有效方法
- 如何创建具有有效维度的常量缓冲区
- FFMPEG音频解码:从短到浮点样本缓冲区的有效转换
- 如何有效地将 std::vector 视为 C 缓冲区