文章目录
- 使用流程
- 实践
- 根据 ubo 名称,获取所有使用了这个 ubo 块的在该 shader 中 ubo 块的索引
- 根据该 ubo 块中的每个属性名字,获取该 ubo 块的每个属性的索引值
- 根据该 ubo 块中每个属性索引值,获取 offset(偏移)、size(大小,这里的大小理解为:元素数量)、type(数据类型)
- 给这个 ubo 块 分配的 binding point index
- 创建一个 GL_UNIFORM_BUFFER 的缓存对象 ubo
- 并将 ubo 绑定到 上面分配的 binding point index 中
- 获取该 ubo 块在 GLSL 编译器分配的字节大小
- 使用该字节大小,创建对应应用层的缓存数据 buffer
- 在需要的时候对该应用层的 buffer 缓存数据进行更新
- 封装 UBO_DATA
- 驱动 UBO 更新
- 外部使用接口
- Shader
- CPP 应用层
- 与 ShaderProgram.setGlobalXXX 的区别
- References
LearnGL - 学习笔记目录
前些篇:
- LearnGL - 15 - Skybox - 天空盒
- LearnGL - 15.1 - Reflection - 反射效果
- LearnGL - 15.2 - Refraction - 折射效果
- LearnGL - 15.3 - 渲染顺序
做了一些简单的 类环境映射的方法,还有其他的一些优化
这一篇:将使用 UBO 来实现 Shader Program Object 之间的数据共享
(注意是 Shader Program Object - Shader 程序对象,而不是 Shader 着色器对象,因为 着色器之间的共享数据在原来使用的 uniform 变量本身就是共享的,但是要在 Shader 着色器程序对象之间共享,就是能 UBO 或是下面简单介绍到的 SSBO)
建议先阅读 OpenGL - UBO 前置内容
本人才疏学浅,如有什么错误,望不吝指出。
数据共享有 UBO(Uniform Block Object - Uniform 块对象) 和 SSBO(Shader Storage Buffer Object - 存储缓存对象,或是叫 SBO 也行)
- UBO 一般用于绘制用,这里使用的是 UBO 的方式,它是 只读 的
- SSBO 以后再使用,一般用通用计算程序使用(类似Compute Shader),它与 UBO 最大区别于,它是 可读写 的
- 根据 ubo 名称,获取所有使用了这个 ubo 块的在该 shader 中 ubo 块的索引
- 根据该 ubo 块中的每个属性名字,获取该 ubo 块的每个属性的索引值
- 根据该 ubo 块中每个属性索引值,获取 offset(偏移)、size(大小,这里的大小理解为:元素数量)、type(数据类型)
- 给这个 ubo 块 分配的 binding point index(这个下面会特别说明)
- 创建一个 GL_UNIFORM_BUFFER 的缓存对象 ubo
- 并将 ubo 绑定到 上面分配的 binding point index 中
- 获取该 ubo 块在 GLSL 编译器分配的字节大小
- 使用该字节大小,创建对应应用层的缓存数据 buffer
- 在需要的时候对该应用层的 buffer 缓存数据进行更新
首先我们得在 GLSL shader 中声明好 ubo 的内容
// camera
// layout (std140)
uniform Camera_UBO {
// world pos
vec3 _CamWorldPos; // 镜头世界坐标
// clear flag
int ClearType; // 渲染相机的 clear type
vec3 ClearColor; // 清理的颜色
// camera transform
mat4 vMat; // v 矩阵
mat4 pMat; // p 矩阵
};
然后在应用层获取这个 “Camera_UBO” 名字的 ubo 块在该 shader 中的索引值
使用到 API glGetUniformBlockIndex
// 获取指定 name 的 shader 中的 ubo 索引
GLuint ubo_idx = glGetUniformBlockIndex(shader, name);
if (ubo_idx == -1) {
// noops
std::cout
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?