【问题标题】:DX11 minimum buffer sizesDX11 最小缓冲区大小
【发布时间】:2013-05-08 06:01:25
【问题描述】:

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

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

而且它没有错误地工作。

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

【问题讨论】:

    标签: c++ vector directx buffer


    【解决方案1】:

    来自MSDN

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

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

    【讨论】:

    • 哇,那么矢量只是幸运的大小,不是吗。
    • @metredigm - 是的,我刚刚编辑了我的答案,请与sizeof(MiscStream) 核对,看看这两个版本的比较。
    • +1 因为这是在谷歌上搜索 DirectX 11 最小缓冲区大小时的热门搜索。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 2014-08-22
    相关资源
    最近更新 更多