[OpenGL]计算机图形学:明暗处理的基本算法

下面来逐个介绍一下基本要点以便加深对于明暗处理的基本算法。


光照方程:

1.光的无穷次反射和吸收过程可以用光照方程(rendering equation)描述。一般是无法求解的,即使应用数值方法也是非常复杂的。

2.光照方程是全局的,并且包含阴影、对象间的多次反射,以后会在光线跟踪和辐射度方法中详细考虑光照方程。

全局效果:


局部与全局光照
正确的明暗处理需要全局计算,即包含了所有的对象和光源。

这与流水线模型不兼容,在这个体系中对每个多边形单独进行明暗处理(局部光照)。

然而在计算机图形学中,特别是在实时图形应用中,如果所得结果看起来可以的话,

这种局部计算是可以接受的,存在许多方法逼近全局效果。



光源的描述:

光线从光源表面离开的方式有两种:自发射、反射。

在表面上任一点(x,y,z)所发出的光可以用θ, φ两个方位角表示以及每个波长λ的强度确定。

光照函数有六个变量:



光源的颜色:

光源不但发射出不同量的不同频率光,而且它们的方向属性随着频率也可能不同。

真正的物理模型将非常复杂。人的视觉系统是基于三原色理论的。

在大多数应用中,可以用三种成分—红、绿、蓝—的强度表示光源

光亮度(luminance)函数为I = [Ir, Ig, Ib]


点光源

由位置和颜色表示。

理想的点光源向各个方向发射光。

远光源即在无穷远处的光源,光线为平行线。

点光源的亮度函数I(p0) = [Ir(p0), Ig(p0), Ib(p0)]。

在点p接受的光亮度反比于光源与点的距离。





点光源的亮度:

点光源的应用:

在计算机图形学中大量应用点光源,是因为它易于使用。

但不能更好地反映物理现实。

只有点光源的场景得到的图像中对比度比较高;对象显得要么很亮,要么很暗,

而真实的光源由于尺寸较大,因此场景的结果比较柔和。


真实光照

完全在阴影中的区域称为本影(umbra)。

部分在阴影中的区域称为半影(penumbra)。

可以在点光源中加入环境光降低高对比度的问题。



聚光灯(spotlight):

具有一个比较的窄的照明范围,通常为圆锥形半无穷区域。

可以给点光源加上一定的限制得到锥的顶点在Ps, 而中心轴方向为Is。

如果θ = 180°, 聚光灯成为点光源。


更真实的聚光灯

光亮度在照明锥内具有一定的分布。

通常绝大多数光集中在照明锥的中心, 因此照明强度是向量s与中心轴夹角φ的函数。

聚光灯的照明强度函数:

可以采用各种方式定义强度函数。

通常定义为cosφ的e次方。

指数e确定光强度衰减的快慢

之所以采用余弦函数,是因为在这种情况下,非常容易计算出来它的值:cosφ = s⋅l。




环境光:

在场景中每个地方都具有相同的强度。

严格意义上说,环境光也是来自于某个光源,但由于在光照计算中进行了某些简化,需要用环境光来模拟多次反射后的效果。

环境光强是由Ia= [Iar, Iag, Iab]确定的,在每点的值完全相同。



对象表面:

如果对象表面光滑,对象显得明亮;如果表面粗糙,那么就显得暗淡

表面有三种类型:镜面(specular surfaces)漫反射面(diffuse surfaces)透明面(translucent surfaces)。



镜面:

表面显得明亮,因为绝大多数光集中在严格镜面反射方向的周围。

镜子是真正的镜面模型。


漫反射面:

特征是反射光向各个方向进入空间

例如:涂有不光滑油漆的墙面。


透明面:

有些光可以进入表面,从对象的另一处出来。

例如:玻璃与水中的折射。这时也会有部分光被反射。

 



理想反射:

法向由局部定向确定:单位化|n| = 1。

入射角= 反射角:θi= θr

三个向量I, n, r必须共面:均为单位向量

r = 2 (l·n)n-I

(n是单位向量,l·n相当于求出了平行四边形的对角线的一半的长度。)



兰伯特(Lambertian)曲面:

真正的漫反射,光向各个方向均匀地反射,模拟粗糙表面。


漫反射光强:

反射光的比例正比于入射光的竖直分量,

即反射光∼cosθi。

如果向量为单位向量,则cosθi= l⋅n。

存在三个系数kr, kb, kg分别相应于每种颜色的光反射的比例。

对每种光,反射光强Id= kd·I·cosθi

特点:

粗糙表面之所以可见,主要是来自于表面的漫反射。

基于简单Lambertian漫反射模型所生成的对象图形显得比较暗淡,

因为此时相当于假定在视点处有一个点光源,

那些光源无法直接照到的地方显得较黑。

在真实的场景中,对象也接受到其它对象反射过来的光。


漫反射参数的影响:



镜面光:

大多数曲面既不是理想的漫反射型曲面,也不是真正的镜面(理想反射)。

光滑表面之所以显出镜面高光,是因为入射光被反射后,绝大多数集中在反射方向周围。


镜面光的模型:

明亮系数:

如果α的值介于100到200之间,那么对应于金属材料。

如果α的值介于5到10之间,材料类似于塑料。


镜面反射参数的影响:


环境光:

环境光是由于在场景中光源与对象间的多次反射而导致的。

环境光的量与颜色依赖于光源的颜色和对象的材料属性。

向漫反射和镜面项中添加上ka和Ia项。

ka:反射系数。

Ia: 环境光强。


环境光的影响:

向漫反射光中加入不同的环境光的效果。

两种光强都是1.0, 漫反射系数为0.04。

环境光反射系数依次为0.0, 0.1, 0.3, 0.5, 0.7。


折射光:


折射方向:


常见材料的折射率:

真实 1                   空气 1.0003

水 1.33              酒精 1.36

冕牌玻璃1.52              石英 1.54

无色玻璃1.65              红宝石1.77

钻石 2.42


多种光的综合

在简单光照模型中,漫反射光、镜面光和折射光同时并存。

即使在折射光中也有一部分光类似于漫反射光向各个方向发射。


距离项:

从点光源到达对象表面的光强反比于两者之间距离的平方。

向漫反射项和镜面项中添加形式为

的因子,其中d表示距离。

常数与线性项软化点光源的效果。



光源:

在光照模型中,把每个光源的结果叠加在一起。

每个光源具有不同的漫反射、镜面和环境光项,从而充分发挥各自最大的弹性,虽然这种处理并没有任何物理上的理由

对三原色中每种分量单独处理因此每个点光源有九个系数分别相应于三色光的三种反射系数。



材料属性

材料属性与光源属性完全匹配

1.九个吸收系数2.明亮系数α


把各种分量叠加在一起:

对每个光源和每种颜色成分的光,光照模型可以表示为(没有距离项):



法向计算

当给定一组光源以及视点的位置,并可以计算出法向量,那么根据前面的模型可以计算出每点的颜色

但是在每点计算法向量是相当费时的工作绝大多数模型是用多边形网格构成的,那么法向的计算可以大大节省。

在多边形网格中每个多边形为平面,那么存在惟一的法向量

这样存在三种明暗处理的方法

1.平坦处理

2.Gouraud方法(插值方法)

3.Phong方法


平坦方法:

在同一多边形上法向为常向量。

视点在无穷远,视点方向v是常向量。

光源在无穷远,入射方向l也是常向量。

从而对于每个多边形,只需要计算其上一点的颜色, 其它点的颜色与它相同。

网格中每个多边形的颜色不同如果多边形网格表示的是一个光滑曲面,那么这种效果显然是不令人满意的


人类视觉系统:

人类视觉系统对光强的变化非常敏感称为lateral inhibition性质

观察到下图边界上的条状效果,称为Mach带没有办法避免这种情形,只有给出更光滑的明暗处理方法。


Gouraud方法:

在网格中每个顶点处有几个多边形交于该点,每个多边形有一个法向,取这几个法向的平均得到该点的法向:

然后利用简单光照模型计算出点的颜色对于多边形内的点,采用线性插值确定颜色。


如何确定法向

如何找出与某个顶点相邻的各多边形?

如果程序中只是列出各顶点,那么没有信息找到上述多边形。

如右所示数据结果却可以做到这一点。


Phong方法:

与Gouraud方法不同,Phong方法是根据每个顶点的法向,插值出多边形内部各点的法向,然后基于光照模型计算出各点的颜色。

通常会有效地降低Mach带效应

得到的图形比应用Gouraud方法的结果更光滑

但是由于法向的计算还是很复杂,一般无法得到实时图形。所花费时间通常是Gouraud方法的6到8倍。

OpenGL实现的是Gouraud方法。


Gouraud和Phong效果对比:


你可能感兴趣的:(计算机图形学)