是否可以保证在多个着色器程序中将统一块声明为相同,例如
uniform Matrices
{
mat4 ProjectionMatrix;
mat4 CameraMatrix;
mat4 ModelMatrix;
};
它具有与返回的相同的块索引glGetUniformBlockIndex(program, "Matrices")
吗?
如果答案是肯定的,那么我能够一次查询该块的索引,并将其用于包含该块的所有着色器程序,对吗?
第二个问题:会ProjectionMatrix
,CameraMatrix
,ModelMatrix
,总是有相同的布局顺序在内存中,分别?我问这个问题是因为我阅读的教程使用了以下功能
// Query for the offsets of each block variable
const GLchar *names[] = { "InnerColor", "OuterColor",
"RadiusInner", "RadiusOuter" };
GLuint indices[4];
glGetUniformIndices(programHandle, 4, names, indices);
GLint offset[4];
glGetActiveUniformsiv(programHandle, 4, indices,
GL_UNIFORM_OFFSET, offset);
而且我不确定是否真的需要,只要我知道制服区中的制服顺序即可。
会
ProjectionMatrix
,CameraMatrix
,ModelMatrix
,总是有相同的布局顺序在内存中,分别?
否。这是标准规定的内容(强调我的意思):
如果pname为
UNIFORM_BLOCK_DATA_SIZE
,则以基本机器单位为单位,返回与实现相关的最小总缓冲区对象大小,该大小必须将所有活动的制服保持在由uniformBlockIndex标识的统一块中。既不能保证也不能期望给定的实现将紧密包装在缓冲区对象中的统一值排列在一起。唯一的例外是std140
统一的块布局,它保证了特定的打包行为,并且不需要应用程序查询偏移和步幅。我不确定是否真的需要,只要我知道制服区中的制服顺序即可。
因此,是的,作者正确的假设是不假设布局是连续的,并且做了明智的事情(保证在所有实现中始终有效):获取统一的索引并分别分配其值。
指定layout(std140)可以解决问题,对吗?
是的,您可以避免同时使用统一缓冲区对象和来查询位置并上传数据std140
。但是,请确保您了解其对齐要求。该信息在其ARB_uniform_buffer_object
规范中有详细说明。有关示例的详细处理,请参阅OpenTK关于使用std140布局规范的统一缓冲区对象(UBO)的文章。
是否可以保证如果在多个着色器程序中声明的统一块相同,则其返回的块索引是否相同
glGetUniformBlockIndex(program, "Matrices")
?
否。我搜索了OpenGL 3.3规范,该规范不提供此类保证。从标准的角度来看,统一的块(默认块或命名块)与程序,周期关联。在规范中,不存在统一程序块的存在/关联。
因为不能保证统一的块在不同的着色器程序中具有相同的索引,所以这意味着我
glBindBufferBase()
每次切换程序时都需要调用,对吗?
是的,请参见ARB_uniform_buffer_object
的规范以获取示例。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句