着色器存储缓冲区对象的速度很慢–是否可以替代?

时间:2019-05-22 01:36:16

标签: opengl glsl fragment-shader

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

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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