• 还是关于Automatic TextureCoordinate Generation


    多谢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是在何时传入固定渲染管线的。

    看来我还是太笨了。
  • 相关阅读:
    Activit 5.13 工作流部署新版本后回退到上一个版本
    一个java的http请求的封装工具类
    FastJSON使用例子
    SoapUI、Postman测试WebService
    PLSQL连接oracle数据库
    python函数修饰符@的使用
    QEMU KVM Libvirt手册(8): 半虚拟化设备virtio
    QEMU KVM Libvirt手册(7): 硬件虚拟化
    多个router和多个network
    nova file injection的原理和调试过程
  • 原文地址:https://www.cnblogs.com/Pointer/p/84367.html
Copyright © 2020-2023  润新知