OpenGL中Uniform Block与Uniform BufferObject的关系

家住魔仙堡 提交于 2020-04-14 01:23:28

【今日推荐】:为什么一到面试就懵逼!>>>

  • 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的内存分布

参考:http://www.selfgleam.com/interface-block-ubo-ssbo.html

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!