【发布时间】: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