我什么时候应该在OpenGL中使用STD140?

时间:2013-04-29 03:37:55

标签: opengl glsl opengl-3 opengl-4

什么时候在OpenGL中使用STD140来实现统一块?

虽然我不是100%肯定,但我相信有一种替代方案可以达到同样的效果,称为“共享”。

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

2 个答案:

答案 0 :(得分:8)

http://www.opengl.org/registry/specs/ARB/uniform_buffer_object.txt

中描述了统一缓冲区对象

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

  1. packed统一块具有与实现相关的数据布局以提高效率,编译器可以消除未使用的制服以节省空间。

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

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

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

答案 1 :(得分:5)

当您拥有一次更新所有的统一块时,

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

你需要在C中对齐一点点,例如,vec3将占用4个浮点数,而不是3个浮点数,但它仍然更容易恕我直言。