关于UBO的介绍和使用详情,请看http://www.zwqxin.com/archives/shaderglsl/communication-between-opengl-glsl-2.html
除了OpenGL手册,应该没有比这个更详细的了。
最近在一个GLSL项目中,需要循环绘制多块buffer,而每次循环都要给buffer传入大量的uniform,导致shader的渲染效率极低。
比如之前的代码是类似这个样子:
m_pProgramBlock->sendUniform3fv(A);
m_pProgramBlock->sendUniform3fv(B);
m_pProgramBlock->sendUniform3fv(C);
m_pProgramBlock->sendUniform3fv(D);
glDrawElements(...);
相应的,在shader中uniform有如下定义:
#version 330
uniform vec3 A;
uniform vec3 B;
uniform vec3 C;
uniform vec3 D;
结果在性能测试中发现,每执行一次sendUniform的操作耗费的时间居然大于执行一次glDrawElements的时间!
GLSL提供了UBO技术能很好的解决这个问题。通过把uniform绑定到显卡的缓冲区,可以极大提升修改Uniform数据的速度。此外他的最大优势在于能在Shader之间共享Uniform。UBO的详细说明请参阅http://www.opengl.org/wiki/Uniform_Buffer_Object
修改后的opengl代码是类似这个样子:
glBindBuffer(GL_UNIFORM_BUFFER, m_uboHandle);
glBufferSubData(GL_UNIFORM_BUFFER, 0, 16, (char*)(&A);
glBufferSubData(GL_UNIFORM_BUFFER, 16, 16, (char*)(&B);
glBufferSubData(GL_UNIFORM_BUFFER, 32, 16, (char*)(&B);
glBufferSubData(GL_UNIFORM_BUFFER, 48, 16, (char*)(&B);
glDrawElements(...);
相应的,在shader中uniform有如下定义:
#version 330
layout(std140) uniform BlobSettings{
vec3 A;
vec3 B;
vec3 C;
vec3 D;
}Blob;
那么到底性能差异有多大呢?使用VS2012的性能测试,可以得到如下数据:
sendUniform占用了9.4%的渲染时间,而一条glBufferSubData只占用了0.1%!
使用glBufferSubData的效率比使用sendUniform高将近2个数量级!
然而使用UBO也要付出代价。因为每个显卡不同,UBO里每个uniform所占用字节数都未必相同,即使你指定了layout(std140)。
分享到:
相关推荐
现代OpenGL+Qt写的一个示例程序,主要用GLSL函数实现Phong光照模型,此外可以通过鼠标控制模型的旋转和缩放。对应博文现代OpenGL+Qt学习笔记之七:Phong光照及在GLSL中使用函数。
自己试写的在opengl中使用GLSL的例子
proj4实现在在glsl中实现坐标变换
hlsl2glsl hlsl转换为glsl图形化工具hlsl2glsl hlsl转换为glsl图形化工具
详细介绍着色器程序中的数据类型的和内置函数,学习GLSL必备,写shader时查阅用
可以在您方便的情况下使用π来在glslify中使用。 用法 PI = require('glsl-pi') 此包导出的Pi的值: 3.14159265359 。 您可以这样使用它: #pragma glslify : PI = require('glsl - pi') uniform float time; ...
介绍 FFmpeg是命令行视频编辑中的事实标准,但使用非平凡的过渡将视频连接在...这个库是一个 ffmpeg 扩展,可以很容易地在 ffmpeg 过滤器图中使用 gl-transitions。 更多详情、使用方法,请下载后阅读README.md文件
vs2019 glsl提示工具个高亮和显示行号
glsl-atmosphere, 使用瑞利和散射渲染天空颜色 glsl大气使用瑞利和散射渲染天空颜色。 演示工具安装npm install glsl-atmosphere示例 Javascriptvar quad = Geometry(gl). attr('a
GLSL 中文手册 PDF
GLSL教程1,用于初学者学习GLSL编辑
GLSL小巧的调试工具,可以代替glDebugger。我自己编译好的,免去自己编译的麻烦
lambert glsl 简单演示
在这个我认为读者对在OpenGL中编程,理解三维渲染模型坐标、视图坐标、剪裁等概念坐标、透视变换和其他关联的转换。没有任何假设但是,有着色编程的经验,所以如果对GLSL来说,这是一个很好的开始。
Atom-linter-glsl.zip,Atom包,它可以在运行中对glsl着色器进行lints操作。棉短绒,atom是一个用web技术构建的开源文本编辑器。
GLSL C++ CLASS
水面模拟,在水面上进行实时镜面反射。反射在GLSL中实现,并在GPU和屏幕空间中运行.zip
glsl es3 官方文档
前端开源库-glsl-transitionsglsl transitions,在glsl.io上创建的glsl transitions集合。
着色器语言学习教程,学习OpenGL的必备技能