【问题标题】:Direct3D11 buffer alignment requirementsDirect3D11 缓冲区对齐要求
【发布时间】:2014-09-22 01:29:53
【问题描述】:

什么(或记录在哪里,我只在 MSDN 上发现了一些模糊的 sn-ps,例如“包括必要时的任何打包”和“...D3D11_BUFFER_DESC 的字节宽度值是 16 的倍数”)是 Direct3D11 的预期对齐/填充各种 ID3D11Buffer 用途(例如顶点和常量缓冲区)?

例如,当将 D3D11_APPEND_ALIGNED_ELEMENT 用于与顶点着色器一起使用的输入布局时,对齐的期望是​​什么?最初我认为任何向量类型都需要 16 字节对齐,但事实并非如此。事实上,似乎实际上甚至没有对整个事物的对齐期望,至少超出浮点类型的 4 字节(没有试图强制编译器未对齐单个原语)。

例如

D3D11_INPUT_ELEMENT_DESC inputDesc[] =
{
    { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
    { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
    { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
//Seems to expect something like
struct Vertex
{
    float float float
    float float float float
    float float
};
//Rather than
__declspec(slign(16)) struct Vertex
{
    float float float padding
    float float float float
    float float padding padding
};
//HLSL
struct Input
{
    float4 pos : POSITION;
    float4 color : COLOR;
    float2 uv : TEXCOORD0;
};

在常量的情况下,甚至还有一个 D3D11_INPUT_ELEMENT_DESC,但仍然存在确保 HLSL 结构声明和 C++ 匹配的问题...

【问题讨论】:

    标签: c++ alignment direct3d11


    【解决方案1】:

    你从错误的一端接近它。您永远不应该尝试在 C++ 代码中对输入布局进行硬编码 - 这只是维护的噩梦,因为每次更改着色器时都必须更改它,并且当您有足够的着色器时,对每个着色器都进行硬编码变得不可行一个。

    相反,请查看 D3DReflect API:

    http://msdn.microsoft.com/en-us/library/windows/desktop/dd607334%28v=vs.85%29.aspx

    基本上,您可以检查已编译的着色器并直接从中读取输入布局,而不是手动指定它。您还可以读取输入名称,然后您可以仅使用着色器需要的那些值动态创建顶点缓冲区。

    【讨论】:

      猜你喜欢
      • 2020-05-15
      • 1970-01-01
      • 1970-01-01
      • 2013-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-17
      相关资源
      最近更新 更多