12

何时在 OpenGL 中将 STD140 用于统一块?

虽然我不是 100% 确定,但我相信有一种替代方案可以实现相同的目标,称为“共享”。

它只是对编码器的偏好吗?还是有理由使用其中一个?

4

2 回答 2

10

统一缓冲区对象在http://www.opengl.org/registry/specs/ARB/uniform_buffer_object.txt中描述

可以将统一块的数据存储声明为使用内存中的三种布局之一:packedsharedstd140.

  1. packed为了提高效率,uniform 块具有依赖于实现的数据布局,编译器可能会消除未使用的uniform 以节省空间。

  2. shared统一块,默认布局,具有依赖于实现的数据布局以提高效率,但布局将由块的结构唯一确定,允许跨程序共享数据存储。

  3. std140统一块具有标准的跨平台跨供应商布局。未使用的制服不会被淘汰。

统一的std140块布局,保证特定的打包行为,并且不需要应用程序查询偏移量和步幅。在这种情况下,即使仅基于统一块声明预先确定了最小大小,仍然可能会查询到最小大小。通过应用 OpenGL 规范中描述的规则集,可以从统一块的定义中导出统一块中每个统一块的偏移量。

于 2013-07-22T08:49:57.343 回答
10

当您有一个一次性更新的统一块时,std140 最有用,例如用于渲染场景的矩阵和照明值的集合。在着色器中使用 std140 声明块,您可以使用结构复制 C 中的内存布局。不必从 C 中查询和保存块中每个单独值的偏移量,您只需调用 glBufferData(GL_UNIFORM_BUFFER, sizeof(my_struct), &my_struct, 即可。

您确实需要在 C 中小心对齐,例如,vec3 将占用 4 个浮点数,而不是 3 个,但恕我直言,它仍然容易得多。

于 2013-07-23T03:04:55.137 回答