2012-03-06 43 views
0

this問題,我問如何創建一個「鏡像」的質感,現在我想搬到這個「鏡像」的形象倒在有關圖像的高度y軸。 我試圖像這樣具有高度不同的值,但我不能找到一個合適的解決方案:傳遞給texture2DGLSL着色器 - 如何計算紋理的高度?

// Vertex Shader 
uniform highp mat4 u_modelViewMatrix; 
uniform highp mat4 u_projectionMatrix; 
attribute highp vec4 a_position; 
attribute lowp vec4 a_color; 
attribute highp vec2 a_texcoord; 
varying lowp vec4 v_color; 
varying highp vec2 v_texCoord; 
void main() 
{ 
    highp vec4 pos = a_position; 
    pos.y = pos.y - HEIGHT; 
    gl_Position = (u_projectionMatrix * u_modelViewMatrix) * pos; 
    v_color = a_color; 
v_texCoord = vec2(a_texcoord.x, 1.0 - a_texcoord.y); 
} 

回答

3

你實際上在你的代碼片段中改變的是你的頂點的Y位置......這當然不是你想要做的。
a_position是您的模型空間位置;座標系以你的四邊形爲中心(我假設你使用四邊形來顯示紋理)。

相反,如果你做的屏幕空間的修改,你就可以將圖像上下等等......所以更改GL_POSITION值:

((u_projectionMatrix * u_modelViewMatrix) * pos + Vec4(0,HEIGHT,0,0)) 

注意,那麼你會在屏幕空間;所以檢查你的視口的尺寸。

最後,獲得您想要做的效果的更好方法是使用旋轉矩陣來翻轉和傾斜圖像。
你會再與您圖像的旋轉(與modelviewmatrix結合起來),結合該矩陣。

您可以選擇要麼通過CPU上的視圖投影乘以模型矩陣:

original_mdl_mat = ...; 
rotated_mdl_mat = Matrix.CreateTranslation(0, -image.Height, 0) * Matrix.CreateRotationY(180) * original_mdl_mat; 
mvm_original_mat = Projection * View * original_mdl_mat; 
mvm_rotated_mat = Projection * View * rotated_mdl_mat; 

或在GPU:

uniform highp mat4 u_model; 
uniform highp mat4 u_viewMatrix; 
uniform highp mat4 u_projectionMatrix; 
gl_Position = (u_projectionMatrix * u_model * u_viewMatrix) * pos; 
+0

但我仍然需要找到一種方法來計算正如湯米提到的那樣,HEIGHT值。我試着用旋轉矩陣,但如何確保旋轉的圖像總是在原始圖像下? – seveves 2012-03-06 08:36:40

+0

對於身高可以穿制服,做HEIGHT/viewport_height。 但更好的方法是做CPU側的矩陣。爲了確保它始終正確,您可以在CPP/ObjC代碼中執行類似操作: original_mdl_mat = ...; rotated_mdl_mat = Matrix.CreateTranslation(0,-image.Height,0)* Matrix.CreateRotationY(180)* original_mdl_mat; 然後將original_mdl_mat傳遞給您的頂點着色器以渲染正常圖像,並通過rotated_mdl_mat渲染旋轉。 注:我使用的DirectX/XNA符號在這裏,但你應該能夠適應它的OpenGL-ES。 – 2012-03-06 09:23:06

+0

問題是,我沒有任何影響的事情發生在CPU上,因爲即時編程對接口,只允許改變着色器和接口不提供模型,視圖和投影分開。我只能訪問與視圖矩陣和投影矩陣結合的模型。界面提供的另一個矩陣是一個常規矩陣。 – seveves 2012-03-06 09:43:52

1

座標總是樣品中的範圍爲[0源,1),的兩個軸上而不管原始紋理大小和寬高比。所以一個kneejerk答案是紋理的高度總是1.0。

如果你想知道的源圖像包含的像素紋理,那麼你就需要提供一個自己的高度 - 這可能是由於一個統一的 - 因爲它不是以其他方式暴露出來。