DX11最小缓冲区大小

obj*_*ect 1 c++ directx buffer vector

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

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

struct MiscStream {
    int rw,rh;
    float shine_factor;
    float dist_factor;
    int random_number;
};
Run Code Online (Sandbox Code Playgroud)

初始化为:

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);
Run Code Online (Sandbox Code Playgroud)

hr将作为E_INVALIDARG返回,程序将失败.

许多其他常量缓冲区以这种方式设置,但它们的结构中都有向量和矩阵.

我将MiscStruct更改为

struct MiscStream {
    D3DXVECTOR3 __r;
    int rw,rh;
    float shine_factor;
    float dist_factor;
    int random_number;
};
Run Code Online (Sandbox Code Playgroud)

它没有错误地工作.

是否有最小结构尺寸?怎么了?

Rog*_*and 6

来自MSDN:

对于常量缓冲区(D3D11_BUFFER_DESC的BindFlags设置为D3D11_BIND_CONSTANT_BUFFER),必须将D3D11_BUFFER_DESC的ByteWidth值设置为16的倍数,并且小于或等于D3D11_REQ_CONSTANT_BUFFER_ELEMENT_COUNT.

所以你可能没有达到"16的倍数"限制.根据您的包装设置,这可能与添加单个元素的大小不同,因此请检查sizeof()以查看实际结构大小.