- UBO( uniform buffer在GLSL中是只能读不能修改 )
用来存储Uniform类型变量的缓冲区对象,类似于定义结构体,使用UBO可以实现让Uniform|变量在不同的着色器语言程序中实现共用,可以设置和更新。 可以在不同的着色语言程序中通过更新UBO中的数据实现所有uniform类型变量的更新 。
- 步骤:1.定义Uniform Block
uniform MatrixBlock
{
mat4 projection;
mat4 modelview;
} matrices;
- 关联Uniform Block 与 binding points——2.获得Uniform Block的索引
GLuint glGetUniformBlockIndex( GLuint program, const char *uniformBlockName );
- 关联Uniform Block 与 binding points——3.将Uniform Block的索引值绑顶到binding points
void glUniformBlockBinding(GLuint program, GLuint uBlockIndex, GLuint uBlockBinding);
- 关联 binding points与UBO——4. binding points与UBO的绑定
4.1.glGenBuffers生成缓冲区对象,需要注意的是要创建GL_UNIFORM_BUFFER
4.2.glBindBuffer绑定GL_UNIFROM_BUFFER
4.3.glBufferData传入缓冲区对象存储的内容
4.4.glBindBufferBase来设置缓冲区与binding point的绑定
/生成UBO
glGenBuffers(1, &buffer);
glBindBuffer(GL_UNIFORM_BUFFER, buffer);
//设置UBO存储的数据(用来给Uniform Block中变量赋值)
glBufferData(GL_UNIFORM_BUFFER, sizeof(myFloats), myFloats, GL_DYNAMIC_DRAW);
//将UBO与同样的binding point关联
glBindBufferBase(GL_UNIFORM_BUFFER, bindingPoint, buffer);
- 设置与更新Uniform Block——5. 获得modelview变量在UBO中相对于UBO存储位置的偏移量
-
void glGetActiveUniformBlockiv(GLuint program, GLuint uBlockIndex, GLenum pname, GLint *params);查询Uniform Block的相关信息
设置与更新Uniform Block——6.设值
void glBufferSubData( GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data);
难点:Uniform Block的内存分布
来源:oschina
链接:https://my.oschina.net/1024and1314/blog/3233834