高级图形编程(基于opengl)4

来源:互联网 发布:银行家算法详解request 编辑:程序博客网 时间:2024/06/05 21:50

1.3 阴影法线

OpenGL是在多边形上点进行光照方程计算阴影面。非常笼统的通过光照方程用顶点位置和一个法线得到在对象上面的位置;这个就是所谓的顶点法线。理论上,这个顶点法线是在从原始模型数据中获取或计算出来的,但是在实际的许多模型中没有包含顶点法线。

给任意一个没有带法线的多边形模型,它可以很容易的生成多边形反光面的阴影法线,但是很难创建一个平滑的阴影的顶点法线。计算两个边的叉积,

U = V0 − V1

V = V2 − V1

   

然后标准化这个结果,

 

   现在我们这个向量 N,也叫做facet normal三角面片指向实体外部的法矢量坐标)。如果1.6所示一个三角面上的两个向量的叉积(假设逆时针方向是面的外侧)

 

计算一个多边形的面法线要不三角形困难的多。有时候多边形不能完全在一个平面上,所以返回结果可能三个点用于计算,如果多边形是四边形,一个好的办法是计算两个对角线向量的叉积。这个两个对角线向量U=V0-V2V=V3-V1进行叉积运算,如图1.7.

 

所以多边形有是超过四个顶点,它很难选择最好的点用于叉积运算。一个方法是选择距离其他点最远的点,或者这些点的叉积结果的平均。

 

  1.3.1 平滑阴影

一个对象的平滑阴影,给定一个顶点法向应用于多边形多有的顶点共享。理论上,这个顶点法线作为面向量在原始面对应的点是相同的,然而,当这个面向量不可用时,最简单的办法是附件公共面的所有向量相加结果标准化(Gouraud 1971)。它提供了合理的是表面光滑的结果,但是它不能很好的处理边缘锯齿效果。

一般来说,多边形模型可用光滑的过度到向量的一个多边形,然而,这个对象也行有hard edges(菱角分明的边)。比如立方体,应该不能得到光滑的边。当这个模型不能指定那个边是菱角分明,取决于这个边的两个多边形的夹角,称之为crease angle(折角),也行使用这个方面可以得到那个边是hard edges

        模型和模型之间不能清晰得通过角度值来分辨是棱角边。90度角度可以清晰的确认为一个棱角边,但是大多数45度折角比较模糊了平滑。应用程序优化一个特殊模型的过度角,使用45度角作为过度值会得到比较好的效果。

       两个多边形之间的角度是使用面法线的点积得到。点积值等于两个向量角的余弦值。当两个向量的点积值大于所需折痕角的余弦值,这个边是soft边,否则就是hard边。一个hard边为每一个边产生独立的法线。大多数模型同时会有hard边和soft边,需要把hard边转换为soft边。得到比较光滑的效果。

       

1.8显示它有两个hard边网格的例子。这个hard边上的三个点,V2,V3V4,需要分裂出两个单独的法线。以V4点为例,一般法线常用的是poly02poly03然不同法线使用poly12poly13.这样可以确定poly03poly03之间边看上去更光滑,然后poly03poly13之间的边有明显的折痕。然而v5没有分裂,poly04poly14之间边更接近V4和会边的光滑越来越接近V5V5V6之间的边完全光滑。这是我们期望的效果。比如一个对象是立方体,三个hard边共享一个点,这这里使用分裂边算法重复应用于三个边得到好的效果。

1.3.2 顶点绕序

      有些3D模型的多边形并不是所有的是逆时针或者逆时针的方向,有时是两种方式的混合。由于多边形的饶许不同可能是背面或者前面,出于性能的考虑,让模型绕序相同是必要的;一个多变的饶序可能和它邻近的顶点绕序是相反的。一个好的办法是查找所有公共边,且确定邻近多边形边的饶序相反(如图1.9)。

         回来我们说一下整个模型,选择其中的一个多边形。所有的邻近多边形会发现与这个多边形保持一致。修改多边形这个过程重复递归旁边多边形止到所有。当这个模型是一个封闭对象,现在所有多边形都是一致的。然而,当这个模型是独立片段,另些多边形尚未测试完成,对其重复执行所有多边形测试止到保持一致。

         确保模型饶序是正确的(即,所有多边形正序使得对象外面的边都是朝外的)。这个方法就是找到对象的几何中心:计算这个对象的包围盒,然后计算它的中心。下一步,选择距离中心点最远的点,计算中心点到这个点的向外的向量。选择这个点所在的多边形点作为基准多边形。计算这个基准多边的向量,然后计算向外向量的法向量的点积。这个值是正值所以基准面的朝外的。结果是负的说这个多边形法向是朝内的。当这个基准多边形是背面,需要修改这个模型的绕序。

 

0 0
原创粉丝点击