C++ DX11最小缓冲区大小

C++ DX11最小缓冲区大小,c++,vector,directx,buffer,C++,Vector,Directx,Buffer,创建几个常量缓冲区后,其中一些缓冲区开始无法正确初始化 使用名为MiscStream的结构创建常量缓冲区,该结构定义为: struct MiscStream { int rw,rh; float shine_factor; float dist_factor; int random_number; }; 并初始化为: D3D11_BUFFER_DESC dx_misc_buffer_desc; ID3D11Buffer* dx_misc_buffer; Zer

创建几个常量缓冲区后,其中一些缓冲区开始无法正确初始化

使用名为MiscStream的结构创建常量缓冲区,该结构定义为:

struct MiscStream {
    int rw,rh;
    float shine_factor;
    float dist_factor;
    int random_number;
};
并初始化为:

D3D11_BUFFER_DESC dx_misc_buffer_desc;
ID3D11Buffer* dx_misc_buffer;

ZeroMemory(&dx_misc_buffer_desc,sizeof dx_misc_buffer_desc);

    dx_misc_buffer_desc.BindFlags=D3D11_BIND_CONSTANT_BUFFER;
    dx_misc_buffer_desc.Usage=D3D11_USAGE_DYNAMIC;
    dx_misc_buffer_desc.ByteWidth=sizeof(MiscStream);
    dx_misc_buffer_desc.StructureByteStride=0;
    dx_misc_buffer_desc.CPUAccessFlags=D3D11_CPU_ACCESS_WRITE;
    dx_misc_buffer_desc.MiscFlags=0;

hr=dx_device->CreateBuffer(&dx_misc_buffer_desc,NULL,&dx_misc_buffer);
hr将作为E_INVALIDARG返回,该计划将失败

许多其他常量缓冲区都是这样设置的,但它们的结构中都有向量和矩阵

我将MiscStruct更改为

struct MiscStream {
    D3DXVECTOR3 __r;
    int rw,rh;
    float shine_factor;
    float dist_factor;
    int random_number;
};
而且它工作正常

是否有最小结构尺寸? 发生了什么事?

来自:

对于常量缓冲区(D3D11_buffer_DESC的BindFlags设置为D3D11_BIND_constant_buffer),必须将D3D11_buffer_DESC的字节宽度值设置为16的倍数,并且小于或等于D3D11_REQ_constant_buffer_ELEMENT_COUNT

所以你可能在“16的倍数”限制上失败了。根据您的打包设置,这可能不同于添加单个元素的大小,因此请使用
sizeof()
查看实际结构大小。

来自:

对于常量缓冲区(D3D11_buffer_DESC的BindFlags设置为D3D11_BIND_constant_buffer),必须将D3D11_buffer_DESC的字节宽度值设置为16的倍数,并且小于或等于D3D11_REQ_constant_buffer_ELEMENT_COUNT


所以你可能在“16的倍数”限制上失败了。根据您的打包设置,这可能不同于将单个元素的大小相加,因此请使用
sizeof()
查看真正的结构大小。

Wow,那么向量只是幸运的大小,是吗。@metredigm-是的,我刚刚编辑了我的答案,请使用
sizeof(MiscStream)检查
查看两个版本的比较情况。+1因为这是搜索DirectX 11最小缓冲区大小时最热门的内容。哇,那么向量就是幸运的大小,是吗。@metredigm-是的,我刚刚编辑了我的答案,请使用
sizeof(MiscStream)检查
查看两个版本的比较情况。+1,因为这是搜索DirectX 11最小缓冲区大小时最热门的内容。