本章主要目标讲的是过滤与模糊,要用到的一个比较常见的功能就是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