什么(或者在文档中,我只在MSDN上找到了一些模糊的片段,比如“必要时包括任何打包”和“D3D11_BUFFER_DESC的...ByteWidth值是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++匹配的问题……
发布于 2014-09-22 01:29:53
你从错误的一端接近它。永远不要尝试在C++代码中硬编码输入布局-这只是一个维护噩梦,因为每次更改着色器时都必须更改它,并且当您有足够的着色器时,硬编码每个单独的着色器就变得不可行。
取而代之的是D3DReflect API:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd607334%28v=vs.85%29.aspx
基本上,您可以检查编译的着色器并直接从它读取输入布局,而不是手动指定它。还可以读取输入名称,并使用该名称仅使用着色器需要的值动态创建顶点缓冲区。
https://stackoverflow.com/questions/25950375
复制相似问题