Uniform Buffer
Uniform Buffer 是一个很有用的缓存,可以将大量的需要传递至多个着色器的矩阵、向量数据等存储在uniform buffer中。这是一个公共的缓存,所以当多个着色器需要传递相同的数据时,可以使用uniform buffer,减少代码量,应该也可以较少CUP传递至GPU的数据量。
大体思路是: 各个着色器中定义uniform块,在OpenGL中定义uniform缓冲,但是这样不知道哪个uniform缓冲 对应 哪个uniform块。为了解决这个问题,OpenGL上下文中设置有绑定点,故我们可以将uniform块绑定到一个bind point,然后将uniform缓冲绑定相同的bind point,这样就对应起来了。
1、着色器中定义uniform块,并设置绑定点
#version 430 core layout (location = 0) in vec3 aPos; layout (location = 1) in vec3 aNormal;out VS_OUT{vec3 FragPos;vec3 Normal; }vs_out;layout (std140, binding=0) uniform Matrix{mat4 projection;mat4 view; }; uniform mat4 model;void main() {vs_out.Normal = mat3(transpose(inverse(model))) * aNormal;vs_out.FragPos = vec3(model * vec4(aPos,1.0f));gl_Position = projection * view * vec4(vs_out.FragPos, 1.0); }
上面的红色代码就是uniform块。
binding=0就是设置uniform块 Matrix 的绑定点为0,这样直接在 shader 中设置绑定点必须在GLSL 4.2以上版本中使用。当然也可以直接在OpenGL中设置绑定点:(不受GLSL版本限制)
unsigned int matrix_index = glGetUniformBlockIndex(shader.ID, "Matrix"); glUniformBlockBinding(shader.ID, matrix_index, 0);
2、定义Uniform Buffer,设置绑定点
void Cube::setupUniformBuffer() {glGenBuffers(1, &this->ubo);glBindBuffer(GL_UNIFORM_BUFFER, this->ubo);glBufferData(GL_UNIFORM_BUFFER, 2 * sizeof(glm::mat4), NULL, GL_STATIC_DRAW);glBindBuffer(GL_UNIFORM_BUFFER, 0);glBindBufferBase(GL_UNIFORM_BUFFER, 0, this->ubo); }
glBufferData()是用来分配内存的。
3、更新uniform buffer
void Cube::setViewMat(glm::mat4 view) {glBindBuffer(GL_UNIFORM_BUFFER, this->ubo);glBufferSubData(GL_UNIFORM_BUFFER, sizeof(glm::mat4), sizeof(glm::mat4), glm::value_ptr(view));glBindBuffer(GL_UNIFORM_BUFFER, 0); }
效果图如下:
使用四个shader,用四种不同的颜色渲染四个盒子
转载于:https://www.cnblogs.com/chen9510/p/11447292.html
Uniform Buffer相关推荐
- 【OpenGL4.0】GLSL-使用Uniform Block实现着色器的数据共享
一.在GLSL中使用Uniform Block 在GLSL渲染语言中,我们经常采用缓冲区来存储Uniform型的Block. 比如我们需要绘制下面这样的效果: 在这里我们绘制了一个圆,圆内部颜色和外部 ...
- uniform对象及其使用
uniform代表opengl中用到的全局数据,是客户端向opengl传送数据的重要方式,该类数据不属于某个具体的shader.每一个uniform数据都属于一个uniform block,而unif ...
- opengl之高级GLSL(2)-接口块,Uniform缓冲对象,Uniform块布局等
接口块 当程序变得更大时,你希望发送的可能就不只是几个变量了,它还可能包括数组和结构体. 为了帮助我们管理这些变量,GLSL为我们提供了一个叫做接口块(Interface Block)的东西,来方便我 ...
- Uniform_buffers/Descriptor layout and buffer
目录 Introduction Vertex shader Descriptor set layout Uniform buffer Updating uniform data Introductio ...
- 【OpenGL】向Shader中传递数据
传递顶点属性信息 之前讲过,vertex shader会被每个顶点调用,通常一个顶点会包含很多信息,例如顶点坐标.顶点法向量.纹理坐标等等,我们称这些信息为顶点的属性.在之前的OpenGL版本里,每个 ...
- opengl版本发展史及各种概念的厘清
1.版本发展 1 opengl的版本区别 1.1 opengl1.1 1995年,SGI推出了更为完善的OpenGL 1.1版本.OpenGL 1.1的性能比1.0版提高甚多.其中包括改 ...
- GPU profile优化
公司GPU优化主要摘录: Geometry Instance:所有静态物体,远处全部代以PointSprite方式绘制,大大减少DrawCall Uniform buffer Object :对于每帧 ...
- OPenGL中的缓冲区对象
引自:http://blog.csdn.net/mzyang272/article/details/7655464 在许多OpenGL操作中,我们都向OpenGL发送一大块数据,例如向它传递需要处理的 ...
- OpenGL 高级GLSL(Advanced GLSL)
OpenGL 高级GLSL OpenGL 高级GLSL简介 GLSL的内建变量 顶点着色器变量 片段着色器变量 接口块 Uniform缓冲对象 Uniform块布局 使用Uniform缓冲 一个简单的 ...
最新文章
- 剑指offer-----Python-----栈
- C语言入门(4)——常量、变量与赋值
- mysql用 fifo 记录日志_MySQL一丢丢知识点的了解
- [git] 基础操作-01-diff / diff head 版本比较 - 非常的详细讨论版本比较中的各种符号的意思,以及如何在git中进行版本比较
- java字符串字节_Java中字符串与byte数组之间的相互转换
- Verilog语言语句介绍
- Java 第十五次作业
- Scacanner类
- quartz 2D 总结
- 第三代计算机期间出现了什么问题,第三代电子计算机使用的电子元件是什么_常见问题解析...
- android代码编写,如何正确编写Android代码
- 输入10个数字,然后逆序输出。
- 搜狐邮箱怎样开启imap服务器,搜狐企业邮箱iPhone如何设置?
- C 语言实例 - 输入n个整数,使其从大到小输出
- 序列标注 | (5) 命名实体识别技术综述
- Vim实用技巧高清完整版PDF中文
- Spring IOC源码剖析—整体认知Spring体系结构
- 怎么自己制作计算机等级考试证件照
- 中国经济两三年内能恢复原状吗
- 罗斯蒙特压力变送器3051DP1A62A1AB4M5K8HR5