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

 

1.2 分解和细分曲面

细分曲面指的是一个分解复杂面的过程,比如一个球,就是有简单的基元组成比如三角形或四边形。大多数OpenGL都高效的支持三角形(条带,扇形,和independents)。三角形是常用的因为他是一个平面而且容易明确的光栅化。在OpenGL实施中处理三角形是最优的,在渲染管线中大多复杂图元比如四边形条带,四边形,和多边形是分解成三角形。

当底层执行时执行分解,他的性能表现在a priori算法,同时当数据创建时或者在应用程序初始化的时,而不是每次绘制的时候使用。另一个优点是应用程序分解图元时在OpenGL执行是稳定和独立的。OpenGL不能指定分解算法,所以默认执行分解四边形或多边形方式不同。当两个不同的OpenGL实现绘制出来的阴影图片和轮廓边缘不同。大多数OpenGL实现都有简单的分解算法。多边形转换三角面使用一些相同的点还有四边形需要两个三角形;第一个三角形使用前三个点,第二个使用第一个的后两个点。

这些简单的分解算法是选中减少计算开销。另外选中分解算法来提高渲染性能。自阴影计算假设在图元是一个平面,选中一个三角形的分解算法生成最匹配的曲面得到最好的阴影效果。分解一个四边形得到一个对角线的新边。

一个方法得到它可以得到更精确的曲率的对角线,在对角线对面的点关联的平面的法线的夹角。这个角度值会随着表面法线变化从一个对角到对面角。形成一对相对的角,角度基本持平是最好的对角线;它将会生成三角形之间形一个平滑边,如图1.1所示。这个算法可能实现计算这对法线的叉积,选择这对中最大的点积(最小的角度)。当平面法线不能知道,我们可以在计算从一个点的两个法线的叉积就是这个点法向量。表面曲率不只是在分解四边形是高效的。另外分裂四边形到大小基本相当的三角形。

    细分曲面对于简单面比如球和圆柱都是比较简单的。关于球的经纬细分曲面大多数的实现用OpenGL Utility(GLU)库实现。虽然这个算法比较容易实现。它有一个缺点是产生的四边形大多数大小不一。如图1.2.明显是大小不同的四边形,尤其是对象计算光照和选择时。

    一个更好的算法是产生大多数大小一致的三角形。八面体和二十面细分工作并不是太难实现。八面体细分曲面到达接近圆的效果,八面体上的点都在球体上,如图1.3.由于八面体的每一个面都是三角面,可以每一个很容易分离成四个新的三角形。

 

在三角形的每一个边中间创建一个新的点,然后连接起来,形成三个新的边。从原始的三角形被分裂成四个新的三角形;这个过程如图1.4.这个过程中新的点还是在这个球体面上的点。在每一个三角形中,可以重复调用这个步骤,一直递归产生新的三角形。

 

 

这个算法也可以适用于20面体的分解,如图1.5,通过递归所有的20个边。其他算法,它也行不能最优的划分两个相当的三角面。分裂三角形出其他比例,比如三个,或者任意数量,当细分执行完成后也许必须产生大小相当的三角形。二十面和八面算法被编码用于取代原来的细分三角形算法,最大程度的提高渲染性能。或者,可以生成独立的三角形索引。这些基元的类型可以有效的提高图形硬件的性能。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值