[英]DX11 minimum buffer sizes
创建一些常量缓冲区后,其中一些缓冲区开始无法正确初始化。
使用名为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;
};
它的工作没有错误。
是否有最小结构尺寸? 怎么了?
从MSDN :
对于恒定缓冲区(将D3D11_BUFFER_DESC的BindFlags设置为D3D11_BIND_CONSTANT_BUFFER),必须将D3D11_BUFFER_DESC的ByteWidth值设置为16的倍数,并且小于或等于D3D11_REQ_CONSTANT_BUFFER_ELEMENT_COUNT。
因此,您可能未能达到“ 16的倍数”限制。 根据您的打包设置,这可能与将各个元素的大小相加不同,因此请使用sizeof()
检查实际结构的大小。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.