UBO(Uniform Buffer Object)是用来存储着色语言中Uniform类型变量的缓冲区对象,使用UBO可以让uniform变量在不同的着色语言程序中实现共用,也可以在着色语言程序中实现uniform类型变量的设置与更新。
提到UBO就必须要提到着色语言GLSL中的Uniform Blocks,它将众多的Uniform类型的变量集中在一起进行统一的管理,对于需要大量Uniform类型变量的程序可以显著地提高性能。
相比传统设置单个uniform类型变量的方式,ubo有着以下一些特点:
1.可以通过切换不同的UBO绑定迅速更新程序中的uniform类型变量的值(在单一着色语言程序中)
2.可以存储更多的uniform类型变量
3.可以在不同的着色语言程序中通过更新UBO中的数据实现所有uniform类型变量的更新
用法如下:
unsigned int uboMatIndex = glGetUniformBlockIndex(lightingCubeShader.ID,"matrices");//获取uniform块的索引
//glUniformBlockBinding(lightingCubeShader.ID, uboMatIndex, 1);//设置更新unifrom块的索引
unsigned int uboMat;
glGenBuffers(1,&uboMat);
glBindBuffer(GL_UNIFORM_BUFFER,uboMat);
//glBindBufferBase(GL_UNIFORM_BUFFER, 1, uboMat);
glBufferData(GL_UNIFORM_BUFFER,sizeof(glm::mat4),NULL,GL_STATIC_DRAW);
//绑定uniform缓冲对象到对应的uniform块的绑定点上
//glBindBufferRange(GL_UNIFORM_BUFFER, 0, uboMatrices, 0/*偏移量*/, 2 * sizeof(glm::mat4)/*大小*/);
glBindBufferRange(GL_UNIFORM_BUFFER, uboMatIndex/*uniform块的索引,如果用glUniformBlockBinding更新了则需要同步更新*/,
uboMat,0,2*sizeof(glm::mat4));
glm::mat4 projMat1 = glm::mat4(1.0f);//投影矩阵
projMat1 = glm::perspective(glm::radians(camera.Zoom), (float)screenWidth / (float)screenHeight, 0.1f, 100.0f);
lightingCubeShader.use();
glBindBuffer(GL_UNIFORM_BUFFER,uboMat);
glBufferSubData(GL_UNIFORM_BUFFER,0,sizeof(glm::mat4),glm::value_ptr(projMat1));