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

时间:2015-08-21 12:25:32

标签: c++ layout directx-11 vertex-buffer

你好!

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

有什么建议吗?谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

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