博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
光滑着色
阅读量:4113 次
发布时间:2019-05-25

本文共 1633 字,大约阅读时间需要 5 分钟。

多边形可以使用平面着色模式或光滑着色模式填充。

平面着色是指多边形所有顶点的颜色都相同,多边形内部具有同顶点(一般取第一个顶点)一样的颜色。

在交界处出现马赫带效应,使得边界突出,破坏完整性。

光滑着色是指多边形各个顶点的颜色不同,多边形内部各点的颜色是由3个顶点的颜色的双线性插值得到。

多边形的光滑着色模式主要有Gouraud明暗处理和Phong明暗处理。更准确称为Gouraud光强插值和Phong法矢插值。

Gouraud光强插值

双线性光强插值是由Gouraud于1971年提出的,又被称为Gouraud明暗处理。它先计算物体表面多边形各顶点的光强,然后用双线性插值,求出多边形内部区域中各点的光强。它的基本算法描述如下:a)计算多边形顶点的平均法向。b)用Phong光照明模型计算顶点的平均光强。c)插值计算离散边上的各点光强。d)插值计算多边形内域中各点的光强。

顶点法向计算:我们用与顶点相邻的所有多边形的法向的平均值近似作为该顶点的近似法向量。假设顶点A相邻的多边形有k个,法向分别为N1,N2,...,Nk,我们取顶点A的法向为

                                                              

    而且我们发现,在一般情况下,用相邻多边形的平均法向作为顶点的法向,与该多边形物体近似的曲面的切平面比较接近,这也是我们采用上面方法计算法向的一个重要原因。

顶点平均光强计算:在求出顶点A的法向Na后,我们可以用Phong光照明模型计算在顶点处的光亮度。但是在Gourand提出明暗处理方法时,Phong模型还没有出现,他们采用的是

                

 光强插值 :    用多边形顶点的光强进行双线性插值,可以求出多边形上各点和内部点的光强。在这个算法步骤中,我们把线性插值与扫描线算法相互结合,同时还用增量算法实现各点光强的计算。算法首先由顶点的光强插值计算各边的光强,然后由各边的光强插值计算出多边形内部点的光强,如下图所示。

双线性光强插值的公式如下:

    如果我们采用增量算法,当扫描线ysj变成j+1时,新扫描线上的点(xa,j+1)和(xb,j+1)的光强,可以由前一条扫描线与边的交点(xa,j)和(xb,j)的光强作一次加法得到:

    而在一条扫描线内部,横坐标xsxaxb递增,当xsi增为i+1时,多边形内的点(i+1ys)的光强可以由同一扫描行左侧的点(iys)的光强作一次加法得到,即:

Phong法矢插值
 
在双线性光强插值中,计算速度比以往的简单光照明模型有了很大的提高,同时解决了相邻多边形之间的颜色突变问题,产生的真实感图象颜色过渡均匀,图形显得非常光滑,这是它的优点,但是,由于采用光强插值,它的镜面反射效果不太理想,而且相邻多边形的边界处的马赫带效应不能完全消除。Phong提出的双线性法向插值以时间为代价,可以部分解决上述的弊病。双线性法向插值将镜面反射引进到明暗处理中,解决了高光问题。与双线性光强插值相比,该方法有如下特点:a 
保留双线性插值,对多边形边上的点和内域各点,采用增量法。
b 对顶点的法向量进行插值,而顶点的法向量,用相邻的多边形的法向作平均。c 
由插值得到的法向,计算每个象素的光亮度。d 
假定光源与视点均在无穷远处,光强只是法向量的函数。

双线性法向插值的式子与光强插值的式子基本类似,只不过是把其中的光强项用法向量项来代替罢了,在这里我们沿用图4.2.5的记号,把I换为N,就有如下的插值公式:

    同时,增量插值计算的公式也与光强插值公式相似,我们只要用法向代替光强即可,在这里我们就不在列出详细的公式了。

    双线性光强插值可以有效的显示漫反射曲面,它的计算量小;而双线性法向插值与双线性光强插值相比,可以产生正确的高光区域,但它的计算量要大的多。当然,这两个插值算法的增量式光照明模型本身也都存在着一些缺陷,具体表现为:用这类模型得到的物体边缘轮廓是折线段而非光滑曲线;由于透视的原因,使等间距扫描线产生不均匀的效果;插值结果决定于插值方向,不同的插值方向会得到不同的插值结果等。

转载地址:http://hlesi.baihongyu.com/

你可能感兴趣的文章
Linux网络编程---I/O复用模型之poll
查看>>
Java NIO详解
查看>>
在JS中 onclick="save();return false;"return false是
查看>>
idea 有时提示找不到类或者符号
查看>>
matplotlib.pyplot.plot()参数详解
查看>>
MFC矩阵运算
查看>>
ubuntu 安装mysql
查看>>
c# 计算器
查看>>
C# 简单的矩阵运算
查看>>
gcc 常用选项详解
查看>>
c++输出文件流ofstream用法详解
查看>>
firewalld的基本使用
查看>>
Linux下SVN客户端使用教程
查看>>
Linux分区方案
查看>>
nc 命令详解
查看>>
如何使用 systemd 中的定时器
查看>>
git命令速查表
查看>>
linux进程监控和自动重启的简单实现
查看>>
OpenFeign学习(三):OpenFeign配置生成代理对象
查看>>
OpenFeign学习(四):OpenFeign的方法同步请求执行
查看>>