不深入理解OpenGL:UBO(UniformBlockObject)

更新时间:2023-05-27 14:16:05 阅读: 评论:0

不深⼊理解OpenGL:UBO(UniformBlockObject)
最近刚刚开始研究图形⽅⾯的东西,如果理解有误请务必指正。在OpenGL 4.5已经有更好的解法了,奈何我辣鸡I卡只⽀持4.4。
UBO是OpenGL 3.1 Core中引⼊的概念。通过到缓存的通信,修改Uniform变量(=运⾏时常量)造成的开销更低,不同的Shader间还可以共享同⼀UBO的内容。具体就不扯那么多了,有兴趣可以阅读了解更多。
因为OpenGL的状态机模型,有的时候调⽤相关API会发⽣意料之外的结果。⼀般也就是画不出东西,再惨就是报错了。这⾥记录⼀下UBO 的缓冲区⽣成与绑定流程:
GLuint buf;
glGenBuffers(1, &buf); // 创建缓存,此时仅仅创建了缓存句柄(name、handle、id,就那个意思),对象并没有被创建。征兵工作
auto index = glGetUniformBlockIndex(prog, "UBOName"); // 通过UBO名查询索引。
glUniformBlockBinding(prog, index, bindingPoint); // 绑定着⾊器程序$prog的UBO到$bindingPoint。bindingPoint不和同⼀程序其他UBO重复即可。
glBindBuffer(GL_UNIFORM_BUFFER, buf); // 在⾸次绑定时会通过句柄构造对象。
glBufferData(GL_UNIFORM_BUFFER, GetUniformBlockSize(index), nullptr, GL_STATIC_DRAW); // 注意显存中内容是未定义的,在指定数据前不可使⽤。glBindBuffer(GL_UNIFORM_BUFFER, 0); // 为了安全解除绑定。
什么湖什么海
煎丸子这⾥通过buf就可以修改相应UBO的内容了。
得实打印机
绘图时再完成另⼀半的绑定:
glBindBufferBa(GL_UNIFORM_BUFFER, bindingPoint, buf); // 绑定缓存$buf到$bindingPoint。也可以使⽤glBindBufferRange()。
需要注意的地⽅:
1. glBindBufferBa()被调⽤时虽然也会将buf绑定到GL_UNIFORM_BUFFER,但在缓存对象没有被构造的时候调⽤glBindBuffer{Ba, Range}会造鸡肉炖蘑菇的做法
待机超长的手机
成GL_INVALID_VALUE错误,参见。所以在构建UBO缓存的时候并没有使⽤这两个⽅法。
牙林一中
2. 从UBO到Binding Point的绑定是对着⾊器程序的操作;⽽从缓存到Binding Point的绑定是对OpenGL状态机进⾏的操作。所以,在每
迷蝴蝶
次draw的时候不需要重新定义UBO到Binding Point的绑定,但需要重新定义对缓存的绑定。参见。

本文发布于:2023-05-27 14:16:05,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/792778.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:缓存   绑定   时候   东西
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图