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

Dan*_*ter 10 opengl glsl opengl-3 opengl-4

我何时使用STD140在OpenGL中使用统一块?

虽然我不是100%肯定,我相信有它的替代,可以实现同样的事情,所谓"共享".

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

Ser*_* K. 8

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

对于均匀块的数据存储可以声明在存储器使用以下三种布局:packed,shared,或std140.

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

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

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

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

  • std430也是另一种选择. (3认同)
  • @AzP根据OpenGL Wiki,std430 *不能*与统一块一起使用。(https://www.khronos.org/opengl/wiki/Interface_Block_(GLSL)#Memory_layout) (2认同)

小智 6

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

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