c++ - DX11 最小缓冲区大小

标签 c++ vector directx buffer

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

一个常量缓冲区是用一个名为 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 返回,程序将失败。

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

我将 MiscStruct 更改为

struct MiscStream {
    D3DXVECTOR3 __r;
    int rw,rh;
    float shine_factor;
    float dist_factor;
    int random_number;
};

它工作正常。

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

最佳答案

来自 MSDN :

For a constant buffer ( BindFlags of D3D11_BUFFER_DESC set to D3D11_BIND_CONSTANT_BUFFER), you must set the ByteWidth value of D3D11_BUFFER_DESC in multiples of 16, and less than or equal to D3D11_REQ_CONSTANT_BUFFER_ELEMENT_COUNT.

所以您可能没有满足“16 的倍数”限制。根据您的打包设置,这可能不同于将各个元素的大小相加,因此请检查 sizeof() 以查看真正的结构大小是多少。

关于c++ - DX11 最小缓冲区大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16433685/

相关文章:

c++ - GetCursorPos 工作正常但 GetPhysicalCursorPos "not declared in this scope"?

c++ - 在头文件中包含 std::vector 会导致模板实例化错误

c++ - 如何从 C++ 中的函数返回一个 vector<T>

c++ - vector<MyClass*> 的 lower_bound

c++ - 计算具有旋转前位置和旋转角度的点的绝对位置

c++ - Boost Log 初始化后设置 max_size

c++ - while true 循环函数

c# - 部署使用 DirectX 程序集的 C# 应用程序

c++ - C++中的左大括号 "{"错误

c# - 引用 AudioVideoPlayback 命名空间