Chapter 5Looking Through a Filter(如何将纹理坐标变换到屏幕坐标)

     本章主要目标讲的是过滤与模糊,要用到的一个比较常见的功能就是Render to texture。

     RenderMonkey中直接可以添加可渲染纹理,我们要做的就是完成如何渲染到纹理的代码。

     书中有一段代码如下:   

 1 float4x4 view_proj_matrix;
 2 float viewport_inv_width;
 3 float viewport_inv_height;
 4 struct VS_OUTPUT
 5 {
 6 float4 Pos: POSITION;
 7 float2 texCoord: TEXCOORD0;
 8 };
 9 VS_OUTPUT vs_main(float4 Pos: POSITION)
10 {
11 VS_OUTPUT Out;
12 // Simply output the position without transforming it
13 Out.Pos = float4(Pos.xy, 0, 1);
14 // Texture coordinates are setup so that the full texture
15 // is mapped completely onto the screen
16 Out.texCoord.x = 0.5 * (1 + Pos.x - viewport_inv_width);
17 Out.texCoord.y = 0.5 * (1 - Pos.y - viewport_inv_height);
18 return Out;
19 }

     Out.texCoord.x = 0.5 * (1 + Pos.x - viewport_inv_width);
     Out.texCoord.y = 0.5 * (1 - Pos.y - viewport_inv_height);
     上述公式书中讲得不是很仔细,其过程是将纹理坐标变换到屏幕坐标,一个线性映射(干脆就是一次函数更直接点),我们这里做一下简单的推导:

       纹理坐标范围为XTex(0,1),YTex(0,1);
       屏幕坐标范围为XScr(-1,1),YScr(-1,1);
      将纹理坐标变换到屏幕坐标,我们要做的就两件事:
      1.        将XTex的范围变换到XScr的范围中;
                XTex(0,1)=> XScr(-1,1);
      2.        将YTex的范围变换到YScr的范围中;
                 YTex(0,1)=> YScr(-1,1);注意:Y方向是要反向的。

      ----------------------------------- X方向推导---------------------------------
       XTex(0,1)=> XScr(-1,1);
       当XTex等于0时,XScr等于-1
       当XTex等于1时,XScr等于1;
       于是我们可以将该变换方程看作是一个过A(0,-1)和B(1,1)的直线,解一个二元一次方程组即可,设直线斜率为k,截距为m,则有XScr = k * XTex+b;
       -1 = 0 * k + b  (1)
       1 = 1* k + b   (2)
       解的b = -1,k = 2;于是我们得到从纹理坐标到屏幕坐标的X方向的变换方程为:
       XScr  = 2 * XTex - 1;

        ---------------------------------- Y方向推导---------------------------------
       YTex(0,1)=> YScr(-1,1);
       //(注意反向)
       当YTex等于0时,YScr等于1
       当YTex等于1时,YScr等于-1;
       于是我们可以将该变换方程看作是一个过A(0,1)和B(1,-1)的直线,解一个二元一次方程组即可,设直线斜率为k,截距为m,则有XScr = k * XTex+b;
       1 = 0 * k + b  (1)
       -1 = 1* k + b   (2)
      解的b = 1,k = -2;于是我们得到从纹理坐标到屏幕坐标的Y方向的变换方程为:
      YScr  =  -2 * YTex + 1 ;
      以上就是从纹理坐标变换到屏幕坐标的推导。

      Screen到Texture跟上边是互逆变换,很容易从上边的公式求的  :)

    

   

      //end

There is no future, we create it.
原文地址:https://www.cnblogs.com/infintyward/p/3161179.html