OpenGL超级宝典(第7版)笔记11 帧缓存运算 计算着色器 清单 3.13
文章目录
OpenGL超级宝典(第7版)笔记11 帧缓存运算 计算着色器 清单 3.131 帧缓存运算1.1 裁剪测试1.2 模板测试1.3 深度测试1.4 混合和逻辑运算阶段。2 计算着色器3 总结上一篇介绍了一下有关片段着色器的相关内容(虽然还有未解决的问题),这一篇我们将介绍图形管线的最后一部分,帧缓存运算,还介绍一下一个单独形成管线的着色器:计算着色器。
1 帧缓存运算
帧缓存是OpenGL管线的最后一个阶段,我们可以把渲染的图像传输给窗口的帧缓存中去,这样我们就能看到绘制的图形了,如果我们需要渲染到屏幕以外的地方(以后的有些计算需要我们这样做),那我们就要提供自己的缓存。
当然在这个环节中,即在写入窗口前我们还要进行很多的筛选和计算,主要是分为4步:裁剪测试,模板测试,深度测试,混合和逻辑运算阶段。
1.1 裁剪测试
我们可以通过设置一个矩形,当像素在矩形外的话,我们就把这些像素丢弃,如果像素在矩形内,那么它的值将会继续进行之后的运算。
1.2 模板测试
这一步的时候我们将比较我们设置的参照值和模板缓存之间的大小。
1.3 深度测试
这是一个非常重要的环节,还记得之前我们在剔除中进行的计算吗,通过计算三角形的正反(向量叉积)来剔除一些不用绘制的三角形。但是我们无法解决前面的三角形挡住了后面三角形的正面这种情况,当时我们提到要用深度测试,而这里就要进行深度测试。
深度测试就是在绘制三角形的像素时判断一下,该三角形在该像素上的深度(Z值)是多少,如果比缓存中的小,那么将该像素的信息覆盖在上面。
比如说我先画一个三角形:
这里标出了每个像素对应的深度图
观察到第一个绘制的三角形是位于Z=0.5平面上的,所以每个像素的深度值现在是0.5(在三角形区域中的像素)。
在绘制第二个三角形时,运行到深度测试的时候,在重叠部分,蓝色的三角形的深度是小于红色的,所以在重叠的区域红色的三角形被蓝色三角形覆盖。虽然显示的是蓝色完全盖住了重叠的区域,但深度测试是逐像素进行的,因为重叠区域蓝色三角形的深度都小于红色,所以蓝色在重叠区域才能全部挡住红色。
因为是逐像素的运行深度测试,所以可以处理两个三角形交叉的复杂情况:
比如在这里的红蓝三角形,因为两个三角形有交叉,这会导致重叠区域(1和2)中,有的区域是蓝色在前(2),而有的区域是红色在前(1),也有非重叠区域(3、4、5、6)。在1、2的区分上逐像素的深度测试就体现出了优势。
假设先绘制的是红色三角形,那么1、2、3、6都会记录为红色三角形在该像素处的深度(这个深度一定是左浅右深的)。当绘制蓝色三角形时,对于5、4区域没什么问题,因为没有重合,但是在运算1区域的像素时,会发现蓝色三角形在该区域的像素深度比当前的像素的深度大(当前像素的深度就是红色三角形在该处的深度,因为红色先绘制),所以蓝色在1区域不会覆盖红色,而2区域相反,蓝色的深度是低于当前像素的深度的(当前像素的深度就是红三角形在该处的深度),所以蓝色会覆盖上去。最终得到了效果图像。
深度测试是对每个像素进行的,虽然有很多的三角形在该像素处重叠,但是我们通过深度测试找到在该像素处深度最低的那一个,最终绘制的结果就是前面的三角形遮挡后面的三角形。
就有点像找一群人中的最矮的那个,先来了一个人(该像素处有一个三角形要进行绘制),看看当前本上记录的最矮的人是谁、比一比看谁更矮(那三角形在该处的深度和缓存中比较),假如新来的人更矮,那就把他当做最矮的人记到本上(进行缓存的覆盖),如果新人高一些,那就不变(不进行覆盖)。在试过所有的人之后(在完成所有的三角形绘制之后),本子上记录的就是最矮的人(缓存中的就是离我们最近的那个图案)。
不知道解没解释清楚O(∩_∩)O
1.4 混合和逻辑运算阶段。
在写入缓存之前还要可以进行混合和逻辑运算,就是把这一帧的内容(还未显示)与之前的内容进行与、或、异或等计算,这部分是OpenGL的一个高度可配置的阶段,之后的章节具体介绍。(应该是第9章了)
2 计算着色器
上面提到,其实结束了混合逻辑运算最终的缓冲已经形成,那么整个图形管线就结束了,那这个计算着色器又是什么呢?
其实计算着色器是单独作为一个管线存在的,这个管线并不直接计算我们要绘制的图形,而是通过帮助计算数据来辅助我们完成渲染,当然你也可以通过它来计算一些其他东西。(也许可以挖矿、进行人工智能的计算等等)。我们把它从渲染管线中抽离出来的原因是为了减轻CPU的负担,因为显卡有大量的核心,可以同时处理很多的数据,由于并行计算的速度很快,所以用显卡计算大量的数据更为快速(这就是为什么挖矿导致显卡涨价而不是CPU涨价…)
我们在建立计算着色器的时候要注意:计算着色器虽然和其他着色器一样需要创建对象,编辑拷贝着色器内容,编译,连接着色器程序,但是不同的是计算着色器不能和其他的着色器放在同一个着色器程序中,也就是说如果一个程序有了计算着色器就不能连接顶点着色器、片段着色器、、、、。
我们看书上的例子吧
清单3.13 一个什么也不干的计算着色器
#version 450 corelayout (local_size_x = 32,local_size_y = 32) in;//指示全局工作组的大小是32*32个工作项void main(void){//什么都不做}
这个计算着色器的确什么也没做,我们在第十章的时候会在进行深入的讨论吧(现在还不会o(╥﹏╥)o)
相关的参考博客:
计算着色器(Compute Shader)
3 总结
这一篇我们介绍了图形管线的最后一个阶段帧缓存运算,包括4部分:裁剪测试,模板测试,深度测试,混合和逻辑运算阶段。其中我们重点介绍了深度测试的基本原理。最后我们对计算着色器做了一个超级简单的介绍(跟只介绍了计算着色器这个名字,没什么区别0v0),其中我们值得注意的是计算着色器在链接着色器程序时,该着色器程序不能链接顶点着色器、片段着色器等图形管线着色器,因为计算着色器是单独运行的一个管线。
下一篇我们将对整个前三章做一个整体的回顾,并且稍微说说OpenGL的扩展(仅提一提,我暂时没有试验过OpenGL的扩展,毕竟读到此处还是初学者,还是先学习OpenGL的核心内容要紧~)
我们下篇见~~
关于书籍的问题
如果你手中没有该书,我还是建议你购买一本,毕竟书本毕竟更加严谨专业,我这里难免遗漏一些细节,主要是提供实例,并做一个消化,将很混乱的流程为大家理清,但这笔记一定是通俗的,是对新手友好的(当然有时候你需要在某些方面自己努努力,比如后面出现的基本线性代数的内容,还有C语言或是c++的基础知识,虽然我可能也不太懂O(∩_∩)O,慢慢来吧)。
别被吓住
刚开始的时候很容易被OpenGL的巨长的函数和超级复杂的流程吓到,其实并没有那么可怕,只要对这样或那样的流程熟悉之后,一切都变得相当简单(当然如果你能提出一个更好的流程那就更好了,当我们把很多基础的工作做完,我们会不断的提出新问题新点子,用新的技术来实现它,最终完成OpenGL的学习)
虽然我也不知道后面将是怎样的道路,但至少努力学习是没错的。
我看过的相关内容
以下并不是全看完了,大部分看了15%就看不下去了,实在是没看懂。(本人没什么计算机编程基础,算是野生程序员吧,很多内容都不能标准表述,望见谅)
如果你对opengl的工作有了一定的了解,我一开始也是从这里开始的,但是仍然有很多的不懂的,最后至今为止,我杂糅了很多的网站内容包括LearnOpenGL、极客学院、哔哩哔哩的闫令琪计算机图形学、哔哩哔哩的傅老师的OpenGL课程、OpenGL编程指南"也称为红宝书"、OpenGL超级宝典"也称为蓝宝书"、当然还有很多的csdn文章O(∩_∩)O这就不介绍了,等用到是时候我在放链接吧O(∩_∩)O
这里面图形学比较易懂也很基础推荐可以作为开始(如果你是学OpenGL需要马上用,应该可以跳过,但是其中的内容很是很重要,这会让后面涉及变换透视的章节更加易懂,推荐大家看看),之后是蓝宝书或是极客学院翻译的教程比较推荐,这两个还是比较适合你我这样的新手的。
这里不推荐看的是红宝书,这本书我看了有点类似于字典那样的工具书,不太适合新手上手学,而且讲的也并不是很通俗易懂(可能是我的书版本比较老吧…)
加油
当然如果你对我有信心,我也会持续更新(虽然前路漫漫),跟大家一同进步(虽然很可能没人看(╥╯^╰╥),无所谓了,当然如有错误还请大家指正∠(°ゝ°),哪里不懂我会尽力解决,哪里说的不好也可以指出我会及时修改~)
我们下篇见~~