首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Direct3D11缓冲区对齐要求

Direct3D11缓冲区对齐要求
EN

Stack Overflow用户
提问于 2014-09-20 23:33:09
回答 1查看 1.3K关注 0票数 1

什么(或者在文档中,我只在MSDN上找到了一些模糊的片段,比如“必要时包括任何打包”和“D3D11_BUFFER_DESC的...ByteWidth值是16的倍数”)是Direct3D11对各种ID3D11Buffer使用(例如顶点和常量缓冲区)的预期对齐/填充?

例如,当使用D3D11_APPEND_ALIGNED_ELEMENT与顶点着色器一起使用输入布局时,对齐的期望是什么?最初我认为任何向量类型都应该是16字节对齐的,但事实似乎并非如此。事实上,似乎整个事情实际上都没有对齐的期望,至少超过了浮点类型的4个字节(没有试图强制编译器对单个原语进行错位)。

例如:

代码语言:javascript
运行
复制
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++匹配的问题……

EN

回答 1

Stack Overflow用户

发布于 2014-09-22 01:29:53

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

取而代之的是D3DReflect API:

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25950375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档