我正在尝试使vec3数组可用于片段着色器。在目标应用程序中,可能有数百个元素。
我测试了以着色器存储缓冲区对象的形式传输数据,该对象声明为
layout(binding = 0) buffer voxels { vec3 xyz[]; }并使用glBufferData设置,但我发现我的片段着色器变得非常慢,即使只有33个元素。
此外,当我将相同的数据转换为const vec3[]的GLSL代码并将其包含在着色器代码中时,着色器会变得明显更快。
有没有更好的方法--比SSBO更快,比创建着色器代码更优雅?
从上面可以明显看出,该数组仅从着色器中读取。它在着色器内以及不同片段的着色器调用上都是恒定的,因此有效地统一,并且在程序的运行时中仅设置一次或几次。
发布于 2019-05-22 12:35:34
考虑到您使用的是vec3数据类型,我建议在SSBO上使用std430布局说明符,否则您将被迫填充数据,这不会很好。通常,如果缓冲区是固定大小的,则首选使用glBufferSubData而不是glBufferData (后者可能会在GPU上重新分配内存)。
作为另一种选择,如果您能够针对GL 4.4+,考虑使用glBufferStorage (或者更好,如果GL4.5可用,则使用glCreateuffers和glNamedBufferStorage)。这让您可以向GL驱动程序传递一些关于缓冲区的使用方式的提示。我会尝试一些选项(例如映射、子数据和每次重新创建)。
https://stackoverflow.com/questions/56248221
复制相似问题