1

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

使用名为 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;
};

它没有错误地工作。

有最小结构尺寸吗?怎么了?

4

1 回答 1

6

来自MSDN

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

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

于 2013-05-08T06:15:58.623 回答