多谢tomb4的指点,发现原来AutoTexCoordGen中最根本的一点被我理解错了。
Object Linear模式并不是在Object Space中以默认投影点做Projective,Eye Linear模式也并非是在Eye Space中以默认投影点做Projective,这是最关键的一点。基于这一点的理解错误,对于Eye Linear模式的TexGen和Object Linear模式的TexGen的结果正确与否的判断也相应错误了。
两者的区别在于:Object Linear模式是基于Object Space中的点做变换的,Eye Linear模式是基于Eye Space中的点做变换的,在TexGen后没有做ModelView变换的情况下,两者的最终结果是相同的,都是基于Projector点(如果没有专门的Projector变换就是指最初的投影点)做Projective获得TexCoord。不同的仅在于参数所使用的Coordinate System。如果TexGen后做了ModelView变换,Object Linear模式不发生变换,Eye Lienar模式则会累加这段变换。
若定义变量如下:
Vo 顶点在object space中的坐标
Ve 顶点在eye space中的坐标
Vt 顶点的纹理坐标
Mp 传入的平面参数
Mb 纹理偏移矩阵
Me 最终的model view matrix
Mg TexGen时的model view matrix
Mm Mg到Me中间所进行的变换
则AutoTexCoordGen的公式为:
object linear模式:
Vt = Mb * Mp * Vo
eye linear模式:
Vt = Mb * Mp * Mg-1 * Ve
其中,因为:Me = Mg * Mm => Me * Mm-1 = Mg * Mm * Mm-1 => Mg = Me * Mm-1
所以eye linear模式又可以变换为:
Vt = Mb * Mp * (Me * Mm-1)-1 * Ve = Mb * Mp * Mm * Me-1 * Ve = Mb * Mp * Mm * Vo
对比object linear模式的公式就可以比较清楚的区分两者的不同了。
关于这一点,NV在ProjTex的文档里面要讲的详细一些,RedBook也没有错,它里的公式实际上是没有进行过Mm变换的,所以两者结果完全相同。不过这真是误导人啊。
另外验证RedBook结论的试验也是错误的,当时没有弄清楚Mg是在何时传入固定渲染管线的。
看来我还是太笨了。