zoukankan      html  css  js  c++  java
  • 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.
  • 相关阅读:
    POJ 1222 高斯消元更稳
    Maven与Eclipse使用中遇到的问题解决之道
    Java并发之任务的描述和执行
    XMemcached简单使用示例
    Java的容器类小结
    Java系统属性与Preferences API的简单介绍
    你知道自己执行的是哪个jre吗?
    Log4J配置文件详解
    Java日志工具之SLF4J
    Java日志工具之Log4J
  • 原文地址:https://www.cnblogs.com/infintyward/p/3161179.html
Copyright © 2011-2022 走看看