Direct3D11缓冲区对齐要求
Direct3D11 buffer alignment requirements
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
基本上,您可以检查已编译的着色器,并直接从中读取输入布局,而不是手动指定它。您还可以读取输入名称,然后可以仅使用着色器所需的值动态创建顶点缓冲区。
相关文章:
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 64位机器上的C++内存对齐
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 使 std::vector 分配对齐内存的现代方法
- 在 capnp FlatArrayMessageReader 的对齐内存缓冲区中接收 zmq 消息
- 如何分配适合容纳 T 类型对象的缓冲区(可能过度对齐、可能有运算符 new 等)
- 不正确的 Vulkan 统一缓冲区内存对齐
- 将缓冲区与 N 字节边界对齐,而不是 2N 字节边界?
- 一个粒子太多:GL_INVALID_VALUE生成错误。<start> 不满足着色器存储缓冲区的最低对齐要求
- 如何在堆栈上对齐缓冲区
- 套接字:在没有memcpy的情况下,使用recvfrom将UDP数据获取到字对齐的缓冲区
- 页面对齐的套接字发送缓冲区
- 为什么缓冲区应该在 64 字节边界上对齐以获得最佳性能
- 对缓冲区使用正确的对齐方式,该缓冲区应该容纳C++中的结构
- Direct3D11缓冲区对齐要求
- OpenGL统一标准缓冲区对齐混淆
- DeviceIoControl缓冲区参数的编组和对齐
- 统一缓冲区对象未对齐.GLSL访问中断