我什么时候在OpenGL中使用STD140统一块?
虽然我不是百分之百确定,但我相信有一种替代方法可以达到同样的效果,叫做"共享"。
这只是对编码员的偏好吗?或者有理由使用其中一个而不是另一个?
统一缓冲区对象的描述见http://www.opengl.org/registry/specs/ARB/uniform_buffer_object.txt
统一块的数据存储可以声明为使用三种内存布局之一:packed
, shared
或std140
。
-
packed
统一块具有与实现相关的数据布局以提高效率,编译器可以消除未使用的统一块以节省空间。 -
shared
统一块,默认布局,具有实现依赖的数据布局效率,但布局将由块的结构唯一决定,允许数据存储在程序之间共享。 -
std140
统一块具有标准的跨平台跨厂商布局。未使用的制服不会被淘汰。
std140
统一块布局,它保证了特定的打包行为,不需要应用程序查询偏移量和步长。在这种情况下,仍然可以查询最小大小,即使它是预先根据统一块声明确定的。通过应用OpenGL规范中描述的一组规则,可以从统一块的定义中派生出统一块中每个统一块的偏移量。
std140是最有用的,当你有一个统一的块,你更新所有的一次,例如矩阵和照明值渲染场景的集合。用std140在你的着色器中声明块,你可以用一个结构体在C中复制内存布局。而不是从C查询和保存块中每个单独值的偏移量,你可以只调用glBufferData(GL_UNIFORM_BUFFER, sizeof(my_struct), &my_struct,一次调用。
在C语言中,你确实需要小心一点对齐,例如,vec3将占用4个浮点数,而不是3个,但它仍然容易得多。