OpenGL超级宝典(第7版)笔记21 着色器存储区块shader storage block 清单5.29-5.30

本文详细介绍了OpenGL着色器存储区块(shader storage block),讲解了其与uniform块的区别,如可修改数据和更大的存储空间。内容包括声明、数据准备和绑定,以及原子内存操作的概念,讨论了内存同步问题和使用屏障的重要性。同时,文章留待解决的问题包括原子内存操作在内存风险中的作用,以及屏障的具体使用和与原子操作的配合。
摘要由CSDN通过智能技术生成

OpenGL超级宝典(第7版)笔记21 着色器存储区块shader storage block 清单5.29-5.30


前言

上一篇为大家介绍了uniform变量和uniform块的用法,其中有许许多多要注意的点,uniform变量和块使得我们可以更方便的传入数据到着色器中去,但是我们的着色器并不能对其数据进行修改,这非常难受,本篇中会为大家介绍着色器储存区块,看看我们是如何建立着色器存储区块(shader storage block)、用着色器修改它的值并传递回来的。

1 着色器存储区块shader storage block 初介绍

其实存储区块(shader storage block)和统一区块(uniform block)很像,都可以向着色器提供数据,但是存储区块的优点在于着色器可以对其数值进行修改,而且存储区块可以更大(uniform块一般大小限制在64k,而存储区块可以达到1G的级别)。当然其也有在一定的缺点,首先是由于存储区块很灵活,导致OpenGL很难对它进行优化,所以访问的时候会稍慢一些。其次uniform块可以更早的读入数据到着色器中,而存储区块可能再顶点着色器开始运行了才读入数据。

两者还是有一些区别的:
第一是存储区块的数据布局是std140或std430(shared不知道行不行),其增加的std430布局在数组和结构的对齐上可以更加紧凑。

std430的布局的工作方式与std140相似,不同之处在于对标量和矢量元素的数组和结构的对齐方式和跨度进行了一些优化(vec3元素除外)。具体来说,它们不再四舍五入为16个字节的倍数。因此,一个floats[]数组将与一个C++floats[]数组匹配。

可详见:OpenGL wiki中的介绍

第二是存储区块还支持原子内存操作,通过将程序序列化执行,防止对同一变量修改的争抢所导致的数据出错(比如两个着色器同时对一个存储区块中的数据进行m=m+1的修改,会产生冲突,结果并不一定是m+2,而原子内存操作就解决了这个问题)

下面我们依次介绍这些内容

1 着色器存储区块

1.1 声明

跟uniform块一样,我们先来看看声明:

layout (binding=6,std430) buffer TransformBlock{
   
	bool open;
	mat4 camera;
	float iso[6];
	vec4 fscolor1;
};												

与之相似的uniform块声明:

uniform TransformBlock{
   
	bool open;
	mat4 camera;
	float iso;			
	vec4 fscolor1;		
} transform;			

其实你仔细对比下面的uniform块,你会发现最后的transform没有了,所以我们在引用存储区块中的变量时不用transform.fscolor来调用了,直接用fscolor就行了。
比如:

void main(void){
   
fscolor = fscolor1.y*vec4(vscolor,1.0);	
gl_Position = camera * vec4(vsposition,1.0);
}

1.2准备数据

由于是std430数据布局所以我们先在纸上演算一下其数据的起始位置都是多少:

layout (binding=6,std430) buffer TransformBlock{
   
	bool open;			//起始:0	对齐基数:4	占用空间:4*1	结束:4
	mat4 camera;		//起始:16	对齐基数:16	占用空间:16*4	结束:80
	float iso[6];		//起始:80	对齐基数:4	占用空间:4*6	结束:104
	vec4 fscolor1;		//起始:112	对齐基数:16	占用空间:16*1	结束:128
};

观察到iso[6]中的每个元素并不是占16字节了,而是其本身

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容简介: 《OpenGL编程指南(原书第7)》对OpenGL以及OpenGL实用函数库进行了全面而又权威的介绍,素有“OpenGL红宝书”之誉。《OpenGL编程指南(原书第7)》的上一个本覆盖了到OpenGL 2.1的内容。本涵盖了OpenGL 3.0和3.1的最新特性。本书以清晰的语言描述了OpenGL的功能以及许多基本的计算机图形技巧,例如创建和渲染3d模型、从不同的透视角度观察物体、使用着色、光照和纹理贴图使场景更加逼真等。另外,本书还深入探讨了许多高级技巧,包括纹理贴图、抗锯齿、雾和大气效果、nurbs、图像处理子集等。此外,《OpenGL编程指南(原书第7)》还对一些重要的主题进行了讨论,例如提高性能、OpenGL扩展以及跨平台技术等。本书内容详实,讲解生动,图文并茂,是OpenGL程序员的绝佳编程指南。 OpenGL是一种功能强大的软件接口,既可以用于生成高质量的计算机图像,也可以用于编写使用2d和3d物体、位图和彩色图像的交互式应用程序。 《OpenGL编程指南(原书第7)》对OpenGL以及OpenGL实用函数库进行了全面而又权威的介绍,素有“OpenGL红宝书”之誉。《OpenGL编程指南(原书第7)》的上一个本覆盖了截止OpenGL 2.1的内容。这一涵盖了OpenGL 3.0和3.1的最新特性。《OpenGL编程指南(原书第7)》清晰的语言描述了OpenGL的功能以及许多基本的计算机图形技巧,例如创建和渲染3d模型、从不同的透视角度观察物体、使用着色、光照和纹理贴图使场景更加逼真等。本书还深入探讨了许多高级技巧,包括纹理贴图、抗锯齿、雾和大气效果、nurbs、图像处理等。另外,《OpenGL编程指南(原书第7)》还对一些重要的主题进行了讨论,例如提高性能、OpenGL扩展以及跨平台技术等。 《OpenGL编程指南(原书第7)》进行了一些更新,涵盖了OpenGL 3.0和3.1的最新特性,包括: 使用帧缓冲区对象进行离屏渲染和纹理更新。 各种新的缓冲区对象类型的示例,包括uniform缓冲区对象、变换反馈缓冲区和顶点数组对象。 使用纹理数组提高使用众多纹理的性能。 使用图元重启和条件渲染来高效地进行渲染。 介绍OpenGL的废弃机制,以及如何针对OpenGL未来本验证程序。 《OpenGL编程指南(原书第7)》继续对OpenGL着色语言(glsl)展开讨论,并解释了使用这种语言创建复杂图形效果并提升OpenGL计算威力的机制。OpenGL技术资料库(OpenGL technical library)提供了大量的OpenGL教程和参考书籍,它可以帮助程序员深入理解OpenGL,完全释放OpenGL的潜力。这个资料库最初由sgi开发,目前由khronos OpenGL体系结构审核委员会(arb)工作组维护,这是负责指导OpenGL以及相关技术发展和演变的行业协会。 作者简介: Dave Shreiner是ARM公司的图形技术总监,长期担任SGI核心OpenGL组的成员。他首次开设了OpenGL的商业培训课程,拥有二十多年的计算机图形应用开发经验。Dava定期参加SIGGRAPH和其他全球性的图形工作会议。他是《OpenGL ES 2.0 Programming Guide》和《OpenGL Reference Manual》的作者,也是Addison-Wesley的OpenGL系列的编辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值