DirectX 11 中是不是可以有 SoA 顶点缓冲区?

Posted

技术标签:

【中文标题】DirectX 11 中是不是可以有 SoA 顶点缓冲区?【英文标题】:Is it possible to have a SoA Vertex Buffer in DirectX 11?DirectX 11 中是否可以有 SoA 顶点缓冲区? 【发布时间】:2015-08-21 12:25:31 【问题描述】:

嗨!

我想知道是否可以在这样的 SoA 方法中构建顶点缓冲区

x1, x2, x3 . . . xn,y1,y2,y3。 . . yn,z1,z2,z3。 . . zn

而不是传统的 AoS 方法

x1, y1, z1, x2, y2, z2, x3, y3, z3 。 . . xn, yn, zn


如果是这样的话.. 是否可以像这样设计ID3D11InputLayout

D3D11_INPUT_ELEMENT_DESC inputDesc[] =                  
             "POSITION", 0, DXGI_FORMAT_R32_FLOAT, 0, 0,       D3D11_INPUT_PER_VERTEX_DATA, 0 ,
             "POSITION", 1, DXGI_FORMAT_R32_FLOAT, 0, offsetToY, D3D11_INPUT_PER_VERTEX_DATA, 0 ,
             "POSITION", 2, DXGI_FORMAT_R32_FLOAT, 0, offsetToZ, D3D11_INPUT_PER_VERTEX_DATA, 0 
        ; 

如何使用这种布局正确调用deviceContext->IASetVertexBuffers

有什么建议吗?谢谢!

【问题讨论】:

等一下...您要分离单个顶点属性单个组件吗? @MateuszGrzejek 我问的原因是我正在实现一个粒子系统并使用英特尔 AVX 内部函数在将粒子数据传递到 IA 阶段之前对其进行修改和重新映射。但是,我在将 SoA 数据转换为 AoS 时遇到了问题,有人告诉我可以使用 SoA 顶点缓冲区。我没有找到任何关于这个主题的东西,所以我必须检查它是否真的可行。 【参考方案1】:

如果您的顶点的所有属性都连续存储,那么您可能可以让它工作。

让顶点的每个元素都在一个单独的顶点流 (0-15) 中,并绑定与顶点组件一样多的顶点缓冲区。请参阅 D3D11_INPUT_ELEMENT_DESC 的“InputSlot”成员。

当您使用 IASetVertexBuffers 绑定您的 N 个顶点缓冲区时,您可以提供每个顶点缓冲区的偏移量作为该顶点元素开始的偏移量。每个顶点流的步长为 4 个字节。

PositionX 的偏移量为 0 字节。 PositionY 的偏移量将是 sizeof(float) * vertex count。 PositionZ 的偏移量将为 2 * sizeof(float) * 顶点数。 等等

或者,您根本不能使用顶点缓冲区,而只需使用着色器资源视图(缓冲区)绑定浮动缓冲区。然后您可以使用 SV_VertexID 定位顶点的每个元素。

X0 可以在索引 0 处找到。 X1 可以在索引 1 处找到。 Y0 可以在索引 (vertexCount) 处找到。 Y1 可以在索引 (vertexCount + 1) 处找到。 Z0 可以在索引 (2 * vertexCount + 1) 处找到。 Z1 可以在索引 (2 * vertexCount + 2) 处找到。 等等

【讨论】:

以上是关于DirectX 11 中是不是可以有 SoA 顶点缓冲区?的主要内容,如果未能解决你的问题,请参考以下文章

将 FBX 顶点和索引缓冲区导入 DirectX 11

使用 DirectX11 更新非 UI 线程中的顶点缓冲区

Directx 11 - 是来自顶点缓冲区的所有顶点都推送到顶点着色器还是只是索引的顶点?

C++ DirectX 11 从第二个顶点缓冲区渲染问题

基于 DirectX11 的 MMDViewer 03-渲染管线

DirectX11--深入理解与使用缓冲区资源