你好!
我想知道是否可以像这样在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 :(得分: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) 等