本章主要目標講的是過濾與模糊,要用到的一個比較常見的功能就是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