软渲染-背面剔除

    给软渲染增加背面剔除,简单的理解就是把看不到的面剔除掉,这样会节省很多无用的渲染。

    问题就是如何判断出当前的面是否可见。这个比较好理解,当我们的视线看不到这个面的正面时,那就表示这个面不可见,如何判断这个面的正面能不能被看到呢?用几何形式来表达就是从眼睛发出的视线与这个面的法线的夹角是否大于90°,因为法线垂直于平面,与法线90°的夹角正好是于平面平行,如果大于90°就在平面下了,所以我们看不到平面上的内容。

    问题简化了,判断视线与平面法线的夹角。我们先来求面法线,两个向量叉乘可得垂直于这两个向量所在平面的一个向量。假设有两个向量a,b,axb 可以求得垂直于ab的向量,但是垂直于a,b有两个方向。axb指向哪个方向呢?通过将a的头与b的尾相接,并检查从a到b是顺时针还是逆时针,能够确定axb的方向。在左手坐标系中,如果a和b呈顺时针,那么axb指向你。如果a和b呈逆时针,axb远离你。在右手坐标系中,恰好相反。如果a和b呈顺时针,axb远离你,如果a和b呈逆时针,axb指向你。

    接下来,就是视线,在进行透视转换后,视线的向量是垂直于屏幕的,所以一直是(0, 0, -1),注意这里是指向的是-z轴跟视线的方向相反。然后用求得的normal点乘(0, 0, -1)即可得到两个向量夹角的cos值,当cos值<0时,表示夹角大于±90°。此时平面可剔除。

    源码在此




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值