是否可以从非 XYZ 顶点缓冲区在 GPU 上构建顶点?
Is it possible to construct vertex on GPU from a non-XYZ vertex buffer?
我正在编写一个粒子模拟,其中使用 Intel AVX 更新逻辑。我正在使用 SoA 方法来最大化我的 "SIMD-friendliness" 但我将粒子位置分量洗牌为 XYZ 格式
更新顶点缓冲区时。
是否可以去掉shuffle部分,直接传入顶点数据
XXYYZZ 格式并在着色器阶段构造每个顶点?
我的第一个想法是使用具有 x、y 和 z 分量的三个顶点缓冲区使用相同的下标索引分离并构造每个顶点以访问顶点的 x、y 和 z 分量。
我知道这不是常规方法,但我想强调这只是一个实验。也许有人对这种方法有所了解(如果可能的话)and/or 可以指出正确的方向吗?也许它也有名字?
谢谢!
对于将顶点输入 GPU 的方式没有限制。您可以自定义输入布局以从任意数量的顶点缓冲区读取值,在您的示例中,您将至少有三个元素。在顶点着色器中,您将三个元素作为三个标量接收并将它们调回。唯一真正的限制是每个值在每个缓冲区中都位于相同的索引处。
在性能方面,除非您想获得 GPU 的前 1% 性能,否则与交错顶点相比,您将看不到任何差异。这主要影响带宽和 L2 缓存未命中,所以除非你有疯狂的数百万粒子,否则不太可能发生。如果有,您可以使用计算着色器在预处理中交错数据。
我正在编写一个粒子模拟,其中使用 Intel AVX 更新逻辑。我正在使用 SoA 方法来最大化我的 "SIMD-friendliness" 但我将粒子位置分量洗牌为 XYZ 格式 更新顶点缓冲区时。
是否可以去掉shuffle部分,直接传入顶点数据 XXYYZZ 格式并在着色器阶段构造每个顶点?
我的第一个想法是使用具有 x、y 和 z 分量的三个顶点缓冲区使用相同的下标索引分离并构造每个顶点以访问顶点的 x、y 和 z 分量。
我知道这不是常规方法,但我想强调这只是一个实验。也许有人对这种方法有所了解(如果可能的话)and/or 可以指出正确的方向吗?也许它也有名字?
谢谢!
对于将顶点输入 GPU 的方式没有限制。您可以自定义输入布局以从任意数量的顶点缓冲区读取值,在您的示例中,您将至少有三个元素。在顶点着色器中,您将三个元素作为三个标量接收并将它们调回。唯一真正的限制是每个值在每个缓冲区中都位于相同的索引处。
在性能方面,除非您想获得 GPU 的前 1% 性能,否则与交错顶点相比,您将看不到任何差异。这主要影响带宽和 L2 缓存未命中,所以除非你有疯狂的数百万粒子,否则不太可能发生。如果有,您可以使用计算着色器在预处理中交错数据。