zoukankan      html  css  js  c++  java
  • 透视投影后的线性插值校正

    许多着色方法都要用到顶点间的线性插值,譬如逐像素着色的Phong Shading往往需要进行纹理坐标等的线性插值。然而,透视投影会导致直接在屏幕空间进行线性插值得到的结果不正确,如下图:

    clip_image002

    在屏幕上进行的线性插值并不对应在物体上的线性插值,这将导致一系列与该插值相关的着色结果出现错误。譬如,如果在屏幕上直接插值纹理坐标,会得到下图中右边的结果(左边为正确的结果):

    clip_image004

    解决该问题的一种方式是利用clip_image006在屏幕空间的线性性。假设坐标为clip_image008clip_image010的点分别被投影到屏幕上坐标为clip_image012clip_image014的位置,直线clip_image016的方程为clip_image018,如下图:

    clip_image020

    若以clip_image022为原点,易见有

    clip_image024

    整理得

    clip_image026

    clip_image028代入方程clip_image030并整理可得

    clip_image032

    类似地,有以下方程成立:

    clip_image034

    类似的式子对clip_image036上的每一点及其投影点都成立。现考虑在clip_image038clip_image040间进行的线性插值clip_image042,有:

    clip_image044

    由此可知,在屏幕上进行的线性插值对应于在投影前空间中对clip_image006[1]的线性插值。现假设要在clip_image008[1]clip_image010[1]间对属性值clip_image046clip_image048进行线性插值得到clip_image050,易知——

    clip_image052

    整理得

    clip_image054

    现在屏幕空间对clip_image006[2]进行线性插值,即

    clip_image056

    将上式代入clip_image050[1]表达式得

    clip_image058

    这就得到了正确的对clip_image060插值的方法:在屏幕空间中对clip_image006[3]clip_image062分别进行线性插值得到clip_image064clip_image066,然后用后者除以前者,即得到clip_image050[2]

    以上推导仅考虑了clip_image068clip_image070坐标,现考虑三角形clip_image072上进行的线性插值,假设屏幕上线性插值的权重为clip_image074clip_image076,真实三角形上对应的权重为clip_image078clip_image080,故有

    clip_image082

    clip_image084

    clip_image086

    注意到clip_image088clip_image090,代入得到

    clip_image082[1]

    clip_image092

    clip_image094

    解得

    clip_image096

    clip_image098

    这就得到了根据clip_image100求出clip_image102的公式。由于在透视投影变换后、坐标齐次化之前,clip_image070[1]clip_image104的比值是一定的,因此上面两个公式中的clip_image070[2]坐标均可换成透视投影变换后、坐标齐次化之前对应的clip_image104[1]坐标。

  • 相关阅读:
    算法——戳气球(最大乘积和)
    算法——股票买卖问题
    算法——最长上升子序列(DP和二分)
    runtime debug sample
    兼顾站点启动与数据安全性
    SQLServer出发器中使用二进制字段
    OutputCache a2过期时间的设置
    wget 163.com
    SQLServer性能优化
    分页控件设计思路
  • 原文地址:https://www.cnblogs.com/AirGuanZ/p/6240219.html
Copyright © 2011-2022 走看看