资源描述:
《深入探索透视纹理映射下》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、深入探索透视纹理映射下深入探索透视纹理映射(下)-潘宏-2010年5月5日-本人水平有限,疏忽错误在所难免,还请各位数学高手、编程高手不吝赐教在上一篇文章中,我们探讨了学习透视纹理映射所需要的基础知识。我们知道了顶点在通过透视投影变换之后,是如何一步一步通过流水线进入屏幕空间的。也知道了一个非常简单的三角形扫描线转换算法,以及通过线性插值实现的仿射纹理映射。尽管我们使用的这个流程非常的直接、简洁,还有大量的细节没有添加(片元操作、雾化、颜色累加、混合等等等等),但这些真的就是组成一个固定流水线的简单光栅器的基本步骤了。但我们目前所提及的光栅化算法完全局
2、限于屏幕空间--我们完全没有考虑进入屏幕空间之前的转换过程,只是在屏幕空间里面对纹理坐标玩弄线性插值。可正如我所说的,仿射纹理映射所基于的假设是不对的,对纹理坐标本身做线性插值也是不对的。那么,错在什么地方呢?我们来分析一下。仿射纹理映射错在什么地方?到底错在什么地方呢?我们再来看看我们上一篇的仿射纹理映射算法,我们把其中的一部分伪代码实现出来:doublex,y,xleft,xright;doubles,t,sleft,sright,tleft,tright,sstep,tstep;for(y=y0;yy1;++y){xleft=用y和左边的直线方程
3、来求出左边的xxright=用y和右边的直线方程来求出右边的xsleft=(y–y0)*(s1–s0)/(y1–y0)+s0;sright=(y–y0)*(s2–s0)/(y2–y0)+s0;tleft=(y–y0)*(t1–t0)/(y1–y0)+t0;tright=(y–y0)*(t2–t0)/(y2–y0)+t0;sstep=(sright–sleft)/(xright–xleft);tstep=(tright–tleft)/(xright–xleft);for(x=xleft,s=sleft,t=tleft;xxright;++x,s+=sst
4、ep,t+=tstep){帧缓冲像素[x,y]=纹理[s,t];}}请注意,在上面的算法中,我们计算sleft、sright以及tleft、tright的时候,是做了关于y的线性插值。这表明在y方向上,纹理坐标s和t的变化和y的变化是按照线性、均匀的方式处理的。另外,纹理坐标s和t的扫描线步长sstep和tstep的计算,是根据扫描线的长度平均分配纹理变化量,也是按照线性、均匀的方式处理的。但是问题在于:投影平面上的线性关系,还原到空间中,就不是那么回事了,这还要从透视投影那段说起,请看下图。这张图是相机空间的一张俯视图。我们把一个多边形通过透视投影的
5、方式变换到了投影平面上,图中红色的是空间中的多边形,蓝色的是变换到投影平面之后的多边形。现在我们暂时在投影面上插值,而不在视口中,后面我们会把结论推广到视口中,而上面那个算法放在投影平面上同样适用。可以看到,在投影平面上的蓝色线段被表示成若干个相等的单位步长线段,相当于我们在上面的算法中递增扫描线位置的步骤--"++x"。而同时也可以看到,投影面上单位步长的线段所对应的投影之前的红色线段的长度却不是相等的,从左到右所对应的长度依次递增。而实际上,我们的纹理坐标是定义在红色的多边形上的,因此纹理坐标的增量应该是和红色线段的步长对应的。但我们的线性插值却把
6、纹理坐标增量根据蓝色线段的步长平均分配了,就是sstep=(sright–sleft)/(xright–xleft);tstep=(tright–tleft)/(xright–xleft);这两步。此外在y方向上的插值sleft,tleft,sright,tright全部都是这样处理的--全部都是错误的!则我们得出的结论是:投影平面上的x、y和纹理坐标s、t不是线性关系。即说了这么半天,我们还没看过仿射纹理映射和透视纹理映射到底差在哪里。下面这张图展示了使用仿射纹理映射导致的错误渲染:左边是让多边形和投影平面平行时候的渲染,这个时候没有任何问题。右边两
7、个是让多边形和投影平面倾斜一定角度,可以看到中间的仿射纹理映射出现了渲染错误--纹理扭曲了--直接对纹理坐标使用线性插值的结果。右边是使用带透视校正的透视纹理映射的效果,不错吧?以上我们从几何直观上感性地认识了仿射纹理映射的错误,现在,我们要从理性上认识它的错误--从数学上来推导正确的方式。透视纹理映射的数学推导这个题目看起来有点严肃。但是请放松,只要掌握了第一篇提到的线性关系和线性插值的理论,并且理解透视投影变换,你完全能够理解这些推导,并把它应用到自己需要解决的问题当中。我们先从最原始的透视投影关系开始推导纹理映射,然后再考虑完整的透视投影变换矩阵
8、下的透视纹理映射关系(二者其实是一样的,但我要证明给你看)。还是来看我们在推导透视投影变换的时