在创建了几个常量缓冲区之后,其中一些缓冲区开始无法正确初始化。
常量缓冲区是使用名为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;
};而且它工作正常,没有错误。
是否有最小结构尺寸?这是怎么回事?
发布于 2013-05-08 14:15:59
来自MSDN:
对于常量缓冲区( BindFlags of D3D11_BUFFER_DESC设置为D3D11_BIND_CONSTANT_BUFFER),必须将D3D11_BUFFER_DESC的ByteWidth值设置为16的倍数,并且小于或等于D3D11_REQ_CONSTANT_BUFFER_ELEMENT_COUNT。
所以你可能没有通过“16的倍数”的限制。根据您的打包设置,这可能与将单个元素的大小相加有所不同,因此请检查sizeof()以了解实际的结构大小。
https://stackoverflow.com/questions/16433685
复制相似问题