什么时候在OpenGL中使用STD140来实现统一块?
虽然我不是100%肯定,但我相信有一种替代方案可以达到同样的效果,称为“共享”。
它只是对编码器的偏好吗?或者是否有理由使用其中一个?
答案 0 :(得分:8)
http://www.opengl.org/registry/specs/ARB/uniform_buffer_object.txt
中描述了统一缓冲区对象可以声明统一块的数据存储使用内存中的三种布局之一:packed
,shared
或std140
。
packed
统一块具有与实现相关的数据布局以提高效率,编译器可以消除未使用的制服以节省空间。
shared
统一块,默认布局,具有与实现相关的数据布局以提高效率,但布局将由块的结构唯一确定,允许跨程序共享数据存储
std140
统一块具有标准的跨平台跨供应商布局。未使用的制服不会被淘汰。
std140
统一块布局,它保证了特定的打包行为,并且不需要应用程序查询偏移和步幅。在这种情况下,即使仅基于统一块声明预先确定最小尺寸,仍可查询最小尺寸。通过应用OpenGL规范中描述的规则集,可以从统一块的定义导出统一块中的每个统一的偏移。
答案 1 :(得分:5)
std140最有用,例如用于渲染场景的矩阵和光照值的集合。在着色器中使用std140声明块,并且可以使用结构在C中复制内存布局。您无需查询和保存C中块中每个单独值的偏移量,只需一次调用即可获得glBufferData(GL_UNIFORM_BUFFER,sizeof(my_struct)和& my_struct)。
你需要在C中对齐一点点,例如,vec3将占用4个浮点数,而不是3个浮点数,但它仍然更容易恕我直言。