|
|
顶点光照计算可以在 world space 做嘛?
OpenGL 和 D3D 的顶点光照计算都是在 view space 做。但是顶
点坐标和光源位置与方向则是在object/model/world space 指定。
这样在进行光照计算之前就需要把相应的位置,向量变换到view
space。如果在 model space 做光照计算,则可以避免这些坐标变
换工作。
但是在 D3D SDK 里面指出,如果在 model space 进行光照计算,则
model space -> view space 的变换矩阵必须是正交的(orthogonal),
为什么有这个需求?我的想法是只要 model_view 变换是刚体变换
(由平移和旋转矩阵组合而成)就可以了,因为光照计算的结果是与
坐标系的选择无关的。
在 OpenGL 里面 model view 变换可以不是刚体变换(glScale, glShear etc),
这种情况下看来是不能在 model space 做光照计算了。但是,如果 model view
不是刚体变换,而光源的位置和方向又是同样在 model space 指定,在顶点坐
标光源位置参数同时经过了非刚体的 model view 变换到 view space 后,这样
的光照计算还有意义吗?这里光源的位置和方向也经过了一个非刚体的变换啊。
反过来说,假如这样正确的话,那在 model space 做光照计算又有何不可呢?
我想肯定正确的方法是首先做非刚体的 model 变换到 world space,然后做刚
体的 view 变换。顶点坐标在 model space 指定,光源位置和方向在 world space
指定。这样不管是在 view space 还是在 world space 做光照计算都正确。 |
|