华科_图形学笔记_09_奇妙的真实感_片元着色01_01

计算机图形学_华中科技大学_中国大学MOOC(慕课)


9.1_图形渲染与视觉外观

提纲

图形渲染的光栅化阶段

一个在精准的线框模型也不可能有真实感。

这里每个三角形的面片叫做一个片元fragment

我们,需要对这个三角形进行片元着色,也就是计算出三角形内部所有像素的颜色值,

只有这样,这个模型才可能最终获得真实感。

其实片元着色是光栅化阶段的第三步

之前的三角形设定和遍历是由gpu根据屏幕映射的结果自动完成的。

显然,接下来的片元着色的工作就十分重要,它需要计算一个三角形面片中每一个像素的颜色值,而这些值,与模型的颜色、材质、表面细节、所处的光照环境都有关系。因此,需要通过复杂的计算才能得到合适的结果。

可是它计算出来的值为什么不能直接作用于帧缓存中的像素?

那是因为,它对应的只是某个模型面片上的颜色值。可是,这个模型还可能与其他物体之间存在着遮挡关系。或者说,这其中还有透明物体的影响。所以,最后需要通过片元操作进行相应的测试和合并工作,最终才能影响到帧缓存中像素点的颜色值。

那么整个过程形象地表示就是这样的,对于一个三角形面片,开始是三个顶点,通过设定得到一个三角形,遍历则是利用插值计算帮我们找到了面片中间其他的像素点。片元着色,只是需要计算这个面片上每个像素点的颜色值,最后通过片元操作得到帧缓存中每个像素点最终的颜色值。

在光栅化阶段,我们重点考虑的就是片元着色和片元操作工作。

我们把重点放在视觉外观与图形渲染关系的讨论上。

 也就是说,我们需要怎样的视觉外观

其实,视觉感知首先是一个物理现象,它的物理过程是这样的

第一步,太阳光与其他光源发出光。

第二步,光与场景中的物体相互作用,有一部分被吸收。

第三步,另一部分散射开来,向新的方向传播。

最后一步,部分光被人眼感知。

人眼感知后,其实感知的是颜色,也就是色调和明暗。哪些光会被人眼感知,感知的过程又是怎样的?颜色怎么表示,又有哪些颜色模型?

接着我们会发现,由于人眼是对光线的感知,其实我们再根据一个光照模型进行着色计算。

体现表面的不同材质,比如表面的光滑与粗糙。

怎样体现不同的光源,比如平行光,点光源,或者说多个光源,这些内容。

在这一节,我们甚至会讨论更加复杂的情况,那就是物体甚至可能是透明的或者是半透明的,这时候就需要考虑光透射模型了。

物体之间也会互相影响,那么这个时候我们就引入了光线追踪算法。

在得到了光照计算以后。对一个三角形面片进行着色计算,也有不同的着色处理方法。这里就给出了三种常用的平滑着色、高洛德的着色与冯氏着色。

第一个,平滑着色就非常简单,就是一个三角形面片用一个颜色。这时候就会出现一种马赫带效应的视觉现象。

第二个,是高洛德着色。就是根据顶点的颜色值进行插值计算,显然大家看中间这个球,它的效果比第一个要好了很多了。

最后,就是冯氏着色,也就是用冯光照明模型对每个像素点进行完全的像素颜色求值。当然,这种处理的效果最好,可是计算量,也最大。

接着,我们就会发现另一个问题。

那就是再好的光照处理,如果忽略了物体的表面细节,也会损失不少的真实感。所谓表面细节,就是纹理

纹理中最简单的就是颜色贴图,或者说平面贴图,比如这里的茶壶绑定了合适的纹理以后,这个茶壶看起来就有细节了。

而另一类纹理处理方式可以使物体表面获得更强的真实感,这种方式叫做几何纹理,也叫做凹凸贴图。

这个思想最早是由图形学界大牛中的大牛 Jim Blinn 提出的,后来的法线贴图、视差贴图、浮雕贴图都是给予类似的思想,只是考虑得越来越全面,效果也越来越逼真。

还有一个问题我们也不得不考虑,那就是我们有一个常识,那就是有光就有影,


9.2_奇妙的颜色_上_视觉现象

通过光栅化的片源着色工作,每个像素点会获得一个颜色值,

什么是颜色?

首先,美国光学学会的色度学委员会曾把颜色定义为,颜色是除了空间的和时间的不均匀性以外的光的一种特性。

也就是光的辐射能刺激视网膜而引起观察者通过视觉获得的景象。

那么我们的国家标准对颜色的定义是这样的。

颜色,是光作用于人眼,引起除形象以外的视觉特性。

英国科学家牛顿在1666年发现,太阳光经过三棱镜折射后,投射到白色的屏幕上,显示出一条像彩虹一样美丽的彩色光带,这个光带就是光谱。

同时,也证明了白光是所有不同波长可见光的组合。

那么白光在折射的时候,就发生了色散现象。

不同波长的折射系数不同,折射后投射在屏幕上的位置当然也就不同。

人眼能看见的光波,就称为可见光,那么这里,就是一个可见光谱。它的波长范围在380到780纳米之间。

那么人的色彩感觉行程包括四大要素,光源、彩色物体、眼睛和大脑。

前面两个对应的是什么?

一个是光源辐射,一个是物体反射,他们属于物理学的范畴。

而后面的两个方面,眼睛和大脑,则是生理学研究的内容。

在人眼事物的时候,会把光线通过屈光系统传导到感光细胞上。感光细胞,就负责感受色彩和明暗。

那么颜色视觉原理,主要有三个流

第一个,是三原色学说,这个学说指出在人眼的视网膜上存在着感受红绿蓝色的锥状细胞,分别对红绿蓝三种光最敏感。一切的颜色特性,都是由这些锥状体的响应量比例来表示的。那么三者共同作用,就让人产生了不同的颜色感觉。

第二个学说,是对立颜色学说,这个学说,是由视觉现象总结出来的规律,他指出,在人眼的视网膜上存在着三种对立视素_红绿、黄蓝和白黑。所有的颜色特性,都是由这三组对立颜色的响应量比例来表示的,红绿、黄蓝决定了它的色调。黑白响应值决定着它的亮度。

最后一个,就是阶段学说,他的理论是视网膜上的锥状细胞是一个三色系统,而视觉信息向大脑皮层视觉中枢传导的过程就变成了四色系统。

除此以外,人眼还有很多有趣的视觉现象,下面我们主要分以下三个方面为大家进行介绍。

第一个,就是颜色辨别。从颜色辨别上,人眼能够分辨100多种颜色,对490纳米的青绿色和590纳米的橙黄色的光波变化最敏感。

在可见光谱的两端人眼的感知是最不敏感的。

第二类视觉现象就是颜色对比。从颜色对比上看,主要表现在相邻区域的不同颜色相互影响。是由视觉暂留效应引起的。这个视觉暂留现象,指的是,视网膜上形成的视像会残留一段时间才消失,其实这也是现代电影动画的基本原理之一。

那么我们可以通过这个动画效果看到我们视觉暂留的影响。比如这几幅静态的图。交替播放以后,我们就看到一个动画的感觉了。

那么颜色对比具体就包括了有同时对比,比如上下两幅图中灰色块的颜色是一样的,可是由于对比区域的颜色不同,我们就看到了不同的效果。

第二个是继时对比,就是看到了一种色彩,再看另一种色彩的时候,就会把前一种色彩的补色加到后一种色彩上。形成一个负后像,比如看了绿色在看黄色的时候,黄色上面似乎有一点鲜红的感觉。

接着就是边界对比,当两种颜色对比的时候,在两种颜色的边界处对比效果最强烈,这里就有我们常见的马赫带效应,

也就是我们9.1节曾经提到的。具体来说,当亮度发生跃变的时候,我们就会发现这里的边缘被增强了。那么在边界的这个地方,明度高的我们感觉就更高明度的,明度低感觉就更低。所以,越接近边界线,这个感觉就越强烈。

接下来是色相对比,大家会发现在这个渐变的色相环中,我们定义了同类色、邻近色、对比色和互补色。他们放在一起进行对比的时候,就会形成不同的视觉印象。

另外还有明度对比,其实就是因为明度差异形成的对比。比如大家看这里,同一个明度的色彩,在白底上和在黑底上感觉就不一样了,在白底上,就显得暗,在黑底上,就显得很亮。

接着是纯度对比。纯度对比是因为纯度的差异而形成的对比,比如同一纯度的颜色。在几乎等明度等色相而纯度不同的两种颜色背景上显示的时候。

效果就不一样,在纯度低的背景色上,他就显得鲜艳,而在纯度高的背景色上,他就显得灰浊。

最后一类想给大家说的是颜色错觉,这类现象挺特别的,主要包括同化现象,色彩的醒目性,色彩的进退,色彩的冷暖、胀缩、软硬,情绪等等。

比如说同化现象,大家看在灰色背景上画黑色的条纹,灰色的背景感觉就有点偏黑了。

同样的灰色划上了白色的条纹,感觉,他就偏白了。

在纹样细小、面积细小的时候,这种现象就会出现。而且,效果刚好和明度对比相反,当配色的色相明度越接近的时候,同化现象的效果就越明显。

接着就是色彩的醒目性,我们会发现,在有些应用的时候,特别需要突出某些部分的色彩,比如路边的一些交通警示牌,包装上的标志等等。

在看色彩的进退,这个现象也挺有意思。我们远距离凝视这些色块儿,就会发现这些色块,有前有后,特别是我们观察这个黄色的这个色块,在白色的背景上,他好像是在最后面。可是在这个灰色和黑色的背景上,我们就感觉他跑到最前面了。也就是说,当前景色与背景色的明度或色相对比比较大的时候,有进的感觉,反之,就有退的感觉。当然,这肯定是一种颜色的错觉。

另外,不同的色彩甚至还会传达出冷暖、胀缩、软硬等不同的感觉,甚至还有一定的情绪。比如蓝色使人情绪稳定、放松,绿色能够缓解疲劳等等。不过对于我们刚才讨论的视觉现象,也不是绝对的感觉,不同的人生理和心理状况不同,对以上色彩的感觉也会有一定的差异。这就是颜色的概念和人眼的视觉现象。


9.2_奇妙的颜色_下_颜色模型

通过上次课,我们了解到了颜色的概念。当然,我们更关注的是可见光谱范围内的颜色,

首先我们来看看这里的颜色纺锤体,又叫颜色锥体。

它是指颜色的视觉模型,由上下两个相对的椎体构成,用于表示颜色的明度、色调和饱和度这三种基本特性的相互关系。

垂体的数轴、圆周和半径分别代表视觉上颜色的明度、色调和饱和度。

这个数轴,由下到上表示,明度从纯黑变换到纯白的这样的一个过程。

这期间只有明度的差异,而没有颜色的区别。而椎体的周围,就代表了红橙黄绿青蓝紫不同的色调,椎体的半径,表示了颜色的饱和度,从中心向圆周,颜色饱和度会增加。

那么这个双锥体内任何一点都表示视觉上可见的颜色。

很显然,圆周处饱和度最高,颜色最单纯,越接近中央,饱和度越低,颜色越接近灰色。

提到颜色模型,CIE的色度图也不得不提。CIE(Commission Internationale de L'Eclariage)是国际照明委员会,根据他的法语名称,简写为CIE。那么这里给出的是CIE_1931色度图,其中X表示红色分量,Y表示绿色分量。由于之前已经进行过归一化,也就是三个颜色分量X加Y加Z是等于一的。那么因此,可以Z算出来,就不必表示出来了,比如这里的E点代表的是白光,它的坐标是0.33,0.33。其实,我们可以算出来,它的三个分量都是0.33,0.33和0.33。

那么所有的单色光都位于这个舌形的曲线上。

所以这条曲线就是单色光的轨迹,我们在曲线旁标注的单色光的这个波长值。

而自然界中各种实际的颜色,其实都位于这条闭合的曲线内。

但是真正落实到不同的颜色模型上,能够表示的颜色其实只是以上颜色的子集。下面,我们就为大家介绍几种常用的颜色模型。

其中RGB和CMY模型,主要是针对设备的。

而HSV和HSL,就是针对用户的。

我们首先就来看看最常见的RGB颜色模型,这种模型,通常用于彩色光栅图形显示设备,像CRT,液晶显示器,Led的显示器,都用的是这种颜色模型。它基于三原色的学说,所以采用了三维直角坐标系。这三个轴,分别对应了红色,绿色和蓝色的颜色分量,整个就构成了这里的一个RGB的立方体,大家可以看到原点处,三个分量都是零,所以就是黑色。而三个分量都是()1,1,1)的这个角点,就呈现着白色。

总体来说,RGB颜色模型是一个加色的模型,就像我们小时候画画调颜色,每增加一个颜色分量,混色以后就会得到不同的结果。可是这种模型,对于打印机、绘图仪之类的硬拷贝设备并不是很适合,因为这样的设备,需要往纸上涂颜料,我们通过反射光看见颜色,而这,其实是一个减色处理。

这样就出现了一个CMY颜色模型,它通过在白色光中减去某一种颜色来定义一种颜色。所以,这里的CMY颜色模型就以红绿蓝的补色,青、品红和黄作为原色来构成颜色模型。从这幅图就可以看到。那么大家看远点没有减色。都为骂,所以本身就为白色。反而,三个分量都唯(1,1,1)的这个交点变成了黑色。

那么以上两种模型其实是适应于不同的设备。

可是对于人来说,都显得不是那么直观,下面,我们就来看看两种针对用户的模型,首先就是HSV模型。

还是从比较好理解的RGB的颜色立方体出发。我们发现,如果沿着对角线。从白色的顶点看,像这个黑色的顶点来观察,

可以看到一个六边形的外形,而六边形的边界就表示着不同的色彩。我们把这个坐标轴的方位在调整一下。垂直的对应绿色,分量左右分别是蓝色和红色,这时候我们就可以得到这样的一个颜色六边形,那么这里的色彩H就可以用顶点与中心的连线与水平轴之间的角度来表示,很显然,范围是从零到360。六边形的顶点,以60度为间隔,那么黄色,就位于60度处,而绿色,在120度处,以此类推。

以这个颜色六边形为基础,我们就得到了这样的一个六棱锥。

那么我们看这里的S,它是色饱和度参数,它指的是颜色的纯度,从零到一变换。

那么边缘的是纯色,S就为1,越接近这个六棱锥的中心,这个S就越小。

那么在这条中轴线上。他就是属于灰度颜色,这时候S就为零了。

这里还有一个明度值的概念V。这个V,从六棱锥顶点零开始变换到顶平面就是1。

那么这里顶点的这个V就是等于零的,他表示是黑色。而到了顶平面这个V就是最大的。

对于纯色来说,不但是刚才的S等于一,而且现在这里的V也是等于一的。

另外我们也可以看到在顶平面的中心,这个点是白色的。

所以,我们就最终得到了这样的一个颜色六棱锥。

这个HSV模型,对于多数用户来说是比较简单直观的一个模型。因为他从某种程度上说对应了画家配色的方法。

比如说,我们可以在一种纯色中加上白色,改变色浓。而加入黑色,改变色深。

同时加入不同比例的白色、黑色,就可以得到不同色调的颜色。

所以看我们平时用到的这个调色盘,通过这几个分量的调节,我们就得到了我们所需要的各种不同的颜色。

最后一种是HSL颜色模型,也叫做HSI颜色模型。

这其中的H,也是表示色调。使用它与水平轴之间的角度来表示范围,也是从零到360度。但他从蓝色开始起点。

S是饱和度,说明颜色的相对浓度。

L_Lightness或者是I_intensity表示的都是亮度。

在L等于零的地方,它是黑色的,在L等于一的时候,它是白色的。

那么我们采用一个近似的圆柱坐标系对它进行表示。

大家有没有发现这种表示方法,很接近我们之前给大家说过的颜色纺锤体。

这也是一种对于用户比较直观的颜色模型。

其实以上的颜色模型还都可以与RGB模型进行相应的转换。比如CMY模型转换到RGB模型就十分简单,只要把对应的分量对一取补就可以了。

Opengl颜色模型

说了这么多关于颜色的问题,最终我们还是要落实到图形编程中。

首先我们看颜色的存储。其实有两种方式

第一种是存储颜色值。也就是直接把它的颜色值保存下来就可以了。

第二种,是颜色索引。那么对于这种模式,它保存的是颜色在颜色索引表中的位置。通过查找颜色索引表对应到实际的颜色值。通常来讲,这种方法可以使得我们占用空间变小,运行速度的变快。但是随着硬件的提速升级,我们目前一般采用直接存储颜色值的方式了。

从颜色模型上看,其实Opengl中采用的是RGB和RGBA这2种。

RGB模式跟刚才讲的RGB颜色模型是一样的。RGB分别表示红绿蓝三色的分量,通过设置。RGB不同的比例获得任意的颜色值。那么同时我们要注意,在opengl中,这三个分量的取值范围都是0.0到1.0,也就是零到一之间。

下面我们再来看看RGB颜色模式这里的RGB。跟之前的是一样的,就多了一个A,A是阿尔法,它的本意是想表示颜色的透明度。但是在Opengl中,很有意思,它其实表示的是颜色的不透明度。因为它的取值范围是零到一。它为一的时候,代表的他是不透明的。而为零的时候,代表的它是透明的。

如果采用RGB颜色模式,我们在设置颜色的时候,就需要四个分量了

这里既然说到了透明度的问题。就不得不说一个颜色混合,也就是Color_Blending的问题。

我们来看看这两个多边形。其中。前面这一个这个多边形是半透明的。那么这两个多边形相交的部分,就需要对两种颜色进行混合了。因为透过这个半透明部分能看到后面的这个多边形,这里其实就有一个计算方法。对应着有一个RGBA的原颜色值。还有一个RGBA目标颜色值。

他们分别都是四个分量。另外,他们还有相对应的调和因子。那么这个调和因子,也是对应着这四个分量。那么新的颜色就可以。用RGBA4个分量,也就是源和目标的两个部分,按照指定的调和因子进行叠加。就是这样的计算公式。这个在之后要讲解的片元操作中会看到相关的应用。

还有一个很有意思的一个应用就是HDR_HighDynamicRange_高动态范围图像,与这个颜色模型也有关系。刚才我们看到RGBA,它的分量都在零到一之间。那么,其实我们超过1.0的时候,就会按1.0来处理。这时候就会有一个问题,当他很亮的时候,比如这里的。按零处理以后,细节就会丢失了。

那么在HDR中我们可以这样,我们记录大范围的颜色值。就是上面的这个轴。之后,再向零到一之间映射。这样就可以获得那些丢失的细节了。

也很像我们的人眼。突然来到一个亮的环境中,开始看不到什么。过一会儿调节一下,就能看到一些细节,这就是HDR。

其实在整个渲染的过程中,我们会发现物体本身的颜色值,光照、材质、纹理都会影响到这个表面最终的颜色值。

大家看这里的茶壶,同样的造型,最终呈现出来的视觉效果完全不同。

另外,物体间的相互遮挡,半透明物体的出现,也会影响到对应像素的最终颜色值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值