是否可以在 DirectX 11 中使用 SoA 顶点缓冲区?

Is it possible to have a SoA Vertex Buffer in DirectX 11?

嗨!

我想知道是否可以在像这样的 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

有什么建议吗?谢谢!

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

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

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

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

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

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