中文第一计算机图形学社区OpenGPU 版权所有2007-2018

 找回密码
 注册

扫一扫,访问微社区

搜索
查看: 2250|回复: 7

为什么在透视除法之前进行裁减

[复制链接]
发表于 2017-6-17 10:35:18 | 显示全部楼层 |阅读模式
为什么在透视除法之前进行裁减,个人理解在变换成NDC后裁减不是也可以吗
发表于 2017-6-17 18:04:17 | 显示全部楼层
图形渲染管线不是固定死的,是可以根据具体的情况进行调整的,只要保证一点,调整后的流水线不会影响最终的结果就行。
发表于 2017-6-19 10:14:56 | 显示全部楼层
个人猜测:
1.如果在透视除法前没裁剪的话,那么在相机背面的图元做透视除法,那么结果是会倒过来的,所以得先裁剪,再做透视除法。
2.先做裁剪,这样管线后续的计算都是在这个裁剪结果上执行的,计算量会变小,包括透视除法。因为你不能保证你传送的图元不会超出视椎太多。
发表于 2017-6-19 16:11:33 | 显示全部楼层
zodiaque 发表于 2017-6-19 10:14
个人猜测:
1.如果在透视除法前没裁剪的话,那么在相机背面的图元做透视除法,那么结果是会倒过来的,所以 ...

第二点是对的,第一点其实不是问题,用w>0的剪裁平面就能解决。
真正的原因很简单,就是避免除零,比如(0, 0, 0, 0)
发表于 2017-6-22 19:11:13 | 显示全部楼层
本帖最后由 JettHuang 于 2017-6-23 11:08 编辑

1. 裁剪    直接在clip space进行裁剪就是简单的线性插值,省去对割点的属性进行透视校正工作;

2. 裁剪完毕后,光栅化三角形
    进行透视除变换到NDC空间,然后就光栅化(这个过程需要做透视校正)



发表于 2017-6-23 12:58:45 | 显示全部楼层
浙滨 发表于 2017-6-19 16:11
第二点是对的,第一点其实不是问题,用w>0的剪裁平面就能解决。
真正的原因很简单,就是避免除零,比如(0 ...

NB,这个没想到...

与视平面平行且通过视点的平面上的坐标的w值都是0,一除所有的坐标值都逼了
发表于 2017-11-27 14:15:46 | 显示全部楼层
之所以放在透视除法之前是因为在裁剪空间中的一条直线上的点在做完透视除法转换到NDC空间以后不一定还在一条直线上(只有穿过相机的直线,在经过透视除法后仍然在一条直线),我们无法解析出裁剪空间中的直线经透视除法后变换到NDC空间的曲线解析式,也就无法在NDC空间中求这条曲线与规范立方体的交点。

假设齐次空间内一条直线上点的坐标为(x,y,z,w),经过透视除法以后生成的点的坐标为(x1,y1,z1,1).其中由(x1,y1)构成的点在二维空间上依旧构成成一条直线,而(x1,y1,z1)在三维空间上不一定是一条直线。原因在于横纵坐标都是根据投影操作计算出来,而z坐标是一个缩放操作得到的。

如果楼主不信的话可以自己推导一遍。也正是因为这个特性才导致整个投影操作被分成了两步,投影变换和透视除法,其中投影变换是线性变换不改变原空间的性质,也就是说模型空间,世界空间,相机空间,齐次空间是几何等价的;而透视除法破坏了这一等价特性。齐次空间是最后面的与模型空间几何等价的空间,也就是说裁剪最迟只能在齐次空间完成。你如果做软渲的话也可以在世界空间裁剪。
发表于 2018-10-10 13:22:21 | 显示全部楼层
本帖最后由 flysheep 于 2018-10-10 13:25 编辑

我也覺得可以在NDC裁切
http://www.opengpu.org/home.php? ... 264&do=blog&id=1797
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|关于我们|小黑屋|Archiver|手机版|中文第一计算机图形学社区OpenGPU

GMT+8, 2018-10-20 16:06 , Processed in 0.071117 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表