Direct3D11缓冲区对齐要求

时间:2014-09-20 15:33:09

标签: c++ alignment direct3d11

什么(或者在哪里记录,我只在MSDN上发现了一些模糊的片段,如“包括必要的任何包装”和“...... D3D11_BUFFER_DESC的ByteWidth值为16的倍数”)是Direct3D11对各种ID3D11Buffer的预期对齐/填充使用(例如顶点和常量缓冲区)?

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

e.g。

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 ++匹配的问题......

1 个答案:

答案 0 :(得分:1)

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

相反,请查看D3DReflect API:

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

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