Direct3D11缓冲区对齐要求

Direct3D11 buffer alignment requirements

本文关键字:对齐 缓冲区 Direct3D11      更新时间:2023-10-16

Direct3D11对各种ID3D11Buffer使用(例如顶点和常量缓冲区)的预期对齐/填充是什么?

例如,对于与顶点着色器一起使用的输入布局,使用D3D11_APPEND_ALIGNED_EELEMENT时,对对齐的期望是什么?起初,我认为任何向量类型都希望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++代码中对输入布局进行硬编码——这只是一场维护噩梦,因为每次更改着色器时都必须更改它,而当您有足够的着色器时,对每个着色器进行硬编码就变得不可行了。

相反,请查看D3DReflect API:

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

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