OpenGL超级宝典第七版学习笔记-uniform(3)

20170320–uniform(3)
1、 uniform块的共享布局(默认布局):效率更好,但是额外工作较多。
2、 每个主程序、每个渲染管线阶段所能用的uniform 块的数量是有限制的,可以使用glGetIntegerv()来查询,至于所查询的目标需要给该函数传递如下参数中的一个:
GL_MAX_UNIFORM_BUFFERS //每个程序允许的最大数量
GL_MAX_VERTEX_UNIFORM_BUFFERS, //定点处理中允许的最大数量


GL_MAX_GEOMETRY_UNIFORM_BUFFERS,几何处理阶段允许的最大数量
GL_MAX_TESS_CONTROL_UNIFORM_BUFFERS,//曲面细分控制器允许的最大数量
GL_MAX_TESS_EVALUATION_UNIFORM_BUFFERS, //曲面细分评估器允许的最大数量
GL_MAX_FRAGMENT_UNIFORM_BUFFERS//片元处理阶段允许的最大数量
3、 把uniform block与buffer绑定在一起实际上分为两步:第一步是把uniform block分配给binding point(绑定点),第二步是把buffer绑定到绑定点上去。这样,对于同一个unifrom,可以直接切换绑定不同的主程序,而不需更改缓存对象。对于保存在默认uniform块中的普通uniform变量,即使分布在不同主程序中的几个变量的名字是一样的,在切换主程序时也需要一一为他们重新设定值。
4、 为uniform block绑定绑定点的方法:
glUniformBlockBinding(GLuintprogram,GLuintuniformBlockIndex,GLuintuniformBlockBinding);参数1是uniform 块所在的主程序,参数2是uniform块的索引,该索引可以通过GLuintglGetUniformBlockNames(GLuint  program, const char* uniformBlockName)来获取;参数3是uniform块要绑定的绑定点。
5、 可以直接在shader中为uniform block指定绑定点,比如:
layout(std140,binding=2) uniform TransformBlock
{
……
……
}
这种方法可以避免使用glUniformBlockBinding()。
6、 在为uniform块绑定了绑定点后,就可以继续把buffer绑定到绑定点上:
glBindBufferBase(GL_UNIFORM_BUFFER,index,buffer);参数一说明要把buffer绑定到uniform的绑定点上去,参数2是绑定点的索引,而不是uniform的索引,这点要注意,参数3即是要绑定的buffer。
7、 在shader中指定绑定点的好处有3条:一是减少了OpenGL的调用,二是在主程序不知道uniform块的名字时可以让一个shader与一个uniform块关联在一起。这样的话,当你在某个缓冲区中按照标准布局保存了一些数据时,而你又想再不同的shader中使用不同的名字来引用它时会很方便。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值