着色器存储缓冲区对象慢——替代方案?

Shader storage buffer object slow – alternative?

我正在尝试使 vec3 的数组可用于片段着色器。在目标应用程序中,可能有数百个元素。

我测试了以着色器存储缓冲区对象的形式传输数据,声明为

layout(binding = 0) buffer voxels { vec3 xyz[]; }

并使用 glBufferData 设置,但我发现我的片段着色器变得非常慢,即使只有 33 个元素。

此外,当我将相同的数据转换为 const vec3[] 的 GLSL 代码并将其包含在着色器代码中时,着色器明显变得更快。

有没有更好的方法——比 SSBO 更快,比创建着色器代码更优雅?

从上面可能已经很明显,数组只在着色器中读取。它在着色器中以及不同片段的着色器调用中保持不变,因此有效地统一,并且在程序运行时仅设置一次或几次。

鉴于您使用的是 vec3 数据类型,我建议在 SSBO 上使用 std430 布局说明符,否则您将被迫填充数据,这不会很好。一般来说,如果缓冲区是固定大小,则更喜欢使用 glBufferSubData 而不是 glBufferData(后者可能会在 GPU 上重新分配内存)。

作为另一种选择,如果您能够以 GL 4.4+ 为目标,请考虑改用 glBufferStorage(或者更好,如果 GL4.5 可用,请使用 glCreateuffers 和 glNamedBufferStorage)。这让您可以向 GL 驱动程序传递更多有关缓冲区消耗方式的提示。我会尝试一些选项(例如映射 v.s。sub-data v.s。每次都重新创建)。