空间划分及可见性算法【二】

先来复习一下背面消隐:

      前提为左手坐标系,每个三角形都会以一定顺序存储三个顶点,按照这个顺序观察三角形,如果是顺时针方向则该面为三角形的正面,另一个面为三角形的背面。有了该假设,我们就可以计算三角形的面法线了,该法线垂直三角形面并指向三角形的正面。选择三角形面上的一点为起点,视点为终点构造一个向量,起名叫做视点向量。根据法线向量和视向量的点积的符号很容易计算该面是否是正面朝向的,即是否可以被消隐。如果启动了背面消隐则三角形只有一面是可见的,如果要求三角形两面都可见则应该禁用背面消隐。

      禁用背面消隐:g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );

 

      通过背面消隐可以消除一部分三角形,但是普通的背面消隐存在局限性:

      <1>由于它没有考虑观察向量方向,所以可能会产生误差。比如,通过普通背面消隐判断为可见的三角形,由于观察方向向量会导致三角形实际是不可见的。

      <2>在室内环境中有很多面都是双面可见的,这时普通的背面消隐就失去了存在的意义。

 

     所以必须把观察向量考虑进来,产生一种新的更严格的背面消隐算法,具体算法就不在赘述了。

 

     有了上述的背面消隐算法,结合BSP树会在视景体剔除中发挥极大作用。因为如果根据背面消隐算法知道当前分割面相对视点是否可见,如果不可见,并且视点在分割面的背面则可以判断出,在该分割面前面的所有的面都是不可见的。同理,如果视点在分割面的前面,且该分割面是不可见的,则可判断在该分割面后面的所有的面都是不可见的。这样就可以迅速的剔除视椎体以外的大量三角形。

 

     到此为止,简单的介绍了使用BSP树对视椎体进行剔除的算法。但是,到目前为止,插入到渲染列表中的的三角形在实际情形中还是有很多是不可见的,也就是冗余的。为了剔除这些冗余三角形,就出现了PVS算法。

 

    PVS(潜在可见集),可以手动建立,也可以使用工具建立,可以存储成数组,也可以存储成矩阵,也存在很多编码方式,在此不再赘述。总之是离线创建的。在插入到渲染列表之前在使用PVS来提取冗余三角形。

 

    Portal(入口),是一种实时的PVS,它根据Portal的大小对视椎体进行裁剪,根据新的视椎体来确定PVS。具体怎么实现以后再介绍。

 

    明天再介绍,BHV和8叉树。

  

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值