您当前的位置: 首页 >  ar

Jave.Lin

暂无认证

  • 4浏览

    0关注

    704博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

LearnGL - 16 - UBO(Uniform Block Object) - 实现 Shader Program Object 之间的数据共享

Jave.Lin 发布时间:2020-08-14 13:29:57 ,浏览量:4

文章目录
  • 使用流程
  • 实践
    • 根据 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 缓存数据进行更新
实践 根据 ubo 名称,获取所有使用了这个 ubo 块的在该 shader 中 ubo 块的索引

首先我们得在 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             
关注
打赏
1664331872
查看更多评论
0.1023s