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相关推荐

  1. 【OpenGL4.0】GLSL-使用Uniform Block实现着色器的数据共享

    一.在GLSL中使用Uniform Block 在GLSL渲染语言中,我们经常采用缓冲区来存储Uniform型的Block. 比如我们需要绘制下面这样的效果: 在这里我们绘制了一个圆,圆内部颜色和外部 ...

  2. uniform对象及其使用

    uniform代表opengl中用到的全局数据,是客户端向opengl传送数据的重要方式,该类数据不属于某个具体的shader.每一个uniform数据都属于一个uniform block,而unif ...

  3. opengl之高级GLSL(2)-接口块,Uniform缓冲对象,Uniform块布局等

    接口块 当程序变得更大时,你希望发送的可能就不只是几个变量了,它还可能包括数组和结构体. 为了帮助我们管理这些变量,GLSL为我们提供了一个叫做接口块(Interface Block)的东西,来方便我 ...

  4. Uniform_buffers/Descriptor layout and buffer

    目录 Introduction Vertex shader Descriptor set layout Uniform buffer Updating uniform data Introductio ...

  5. 【OpenGL】向Shader中传递数据

    传递顶点属性信息 之前讲过,vertex shader会被每个顶点调用,通常一个顶点会包含很多信息,例如顶点坐标.顶点法向量.纹理坐标等等,我们称这些信息为顶点的属性.在之前的OpenGL版本里,每个 ...

  6. opengl版本发展史及各种概念的厘清

    1.版本发展 1 opengl的版本区别 1.1 opengl1.1        1995年,SGI推出了更为完善的OpenGL 1.1版本.OpenGL 1.1的性能比1.0版提高甚多.其中包括改 ...

  7. GPU profile优化

    公司GPU优化主要摘录: Geometry Instance:所有静态物体,远处全部代以PointSprite方式绘制,大大减少DrawCall Uniform buffer Object :对于每帧 ...

  8. OPenGL中的缓冲区对象

    引自:http://blog.csdn.net/mzyang272/article/details/7655464 在许多OpenGL操作中,我们都向OpenGL发送一大块数据,例如向它传递需要处理的 ...

  9. OpenGL 高级GLSL(Advanced GLSL)

    OpenGL 高级GLSL OpenGL 高级GLSL简介 GLSL的内建变量 顶点着色器变量 片段着色器变量 接口块 Uniform缓冲对象 Uniform块布局 使用Uniform缓冲 一个简单的 ...

最新文章

  1. 剑指offer-----Python-----栈
  2. C语言入门(4)——常量、变量与赋值
  3. mysql用 fifo 记录日志_MySQL一丢丢知识点的了解
  4. [git] 基础操作-01-diff / diff head 版本比较 - 非常的详细讨论版本比较中的各种符号的意思,以及如何在git中进行版本比较
  5. java字符串字节_Java中字符串与byte数组之间的相互转换
  6. Verilog语言语句介绍
  7. Java 第十五次作业
  8. Scacanner类
  9. quartz 2D 总结
  10. 第三代计算机期间出现了什么问题,第三代电子计算机使用的电子元件是什么_常见问题解析...
  11. android代码编写,如何正确编写Android代码
  12. 输入10个数字,然后逆序输出。
  13. 搜狐邮箱怎样开启imap服务器,搜狐企业邮箱iPhone如何设置?
  14. C 语言实例 - 输入n个整数,使其从大到小输出
  15. 序列标注 | (5) 命名实体识别技术综述
  16. Vim实用技巧高清完整版PDF中文
  17. Spring IOC源码剖析—整体认知Spring体系结构
  18. 怎么自己制作计算机等级考试证件照
  19. 中国经济两三年内能恢复原状吗
  20. 罗斯蒙特压力变送器3051DP1A62A1AB4M5K8HR5

热门文章

  1. CAD中能显示打印不显示
  2. 闵帆老师《论文写作》学习心得
  3. Spring Boot框架基础介绍
  4. STM32+MQTT
  5. 3D柜体导出CAD优化参考方案
  6. 《2021 DDoS攻击态势报告》解读 | 基于威胁情报的DDoS攻击防护
  7. 2013计算机等级考试三级教程网络技术,全国计算机等级考试三级教程——网络技术(2013年版)...
  8. 设计模式相关内容介绍—UML
  9. vscode中python调试的断点失效
  10. 使用spacedesk实现两台笔记本的低延迟屏幕扩展