有可能在DirectX 11中拥有SoA顶点缓冲区吗

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

本文关键字:SoA 顶点 缓冲区 拥有 DirectX 有可能      更新时间:2023-10-16

我想知道是否有可能在像这样的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(*顶点计数
etc

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

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