openGL学习-uniform缓存

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));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值