步履蹒跚

知其然,知其所以然 - real-time rendering.
posts - 85, comments - 172, trackbacks - 0, articles - 0

还是关于Automatic Texture-Coordinate Generation

Posted on 2004-12-30 16:04 Pointer 阅读(572) 评论(1)  编辑 收藏 所属分类: 开发随笔
多谢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中的坐标
V 顶点的纹理坐标
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是在何时传入固定渲染管线的。

看来我还是太笨了。

Feedback

#1楼 [楼主]   回复  引用  查看    

2004-12-30 16:27 by Pointer      
还可以对Projector进行变换,变换结果矩阵和Mb累加后用TextureMatrix传入固定渲染管线。

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2004-12-31 09:18 编辑过


相关链接: