2012-08-28 121 views
0

我在OpenGL ES 2.0中有一個投影,但不幸的是我希望Y是積極的,所以我更容易使用TouchEvents。OpenGL ES 2.0投影映射爲正Y?

眼下是這樣的投影矩陣:

private void setOrthographicMatrix(int w, int h) 
{ 
    orthographicMatrix[0] = (float) (2.0f/w); //a 
    orthographicMatrix[3] = -1f;     //tx 
    orthographicMatrix[5] = (float) (2.0f/h); //b 
    orthographicMatrix[7] = 1f;     //ty 
    orthographicMatrix[10] = -1f;    //c 
    orthographicMatrix[15] = 1f;     //1 

// a, 0, 0, tx, 
// 0, b, 0, ty, 
// 0, 0, c, tz, 
// 0, 0, 0, 1 
} 

頂點着色器:

attribute vec4 a_position; 
attribute vec2 a_texCoord; 

varying vec2 v_texCoord; 

uniform mat4 u_MVPMatrix; 

void main() 
{ 
    //Pass Values to Fragment Shader 
    v_texCoord = a_texCoord; 

    //Set Position 
    gl_Position = a_position * u_MVPMatrix; 
} 

片段着色器:

precision mediump float; 

varying vec2 v_texCoord; 

uniform vec4 u_color; 
uniform sampler2D u_s_texture; 

void main() 
{ 
    gl_FragColor = texture2D(u_s_texture, v_texCoord) * u_color; 
} 

,其結果是:(0,0) - 全角

0,0----------> X++ 
| 
| 
| 
↓ 
Y-- 

我想要投影映射,所以Y在屏幕上變爲正值。

編輯 - 解決方案:

我已經取代了OrthographicMatrix功能的設置使用內置在Android中矩陣庫:

Matrix.orthoM(orthographicMatrix, 0, 0, w, h, 0, -10f, 10f); 

而且改變了我的頂點着色器這樣的:

gl_Position = u_MVPMatrix * a_position; 

回答

1

我建議只使用OpenGL的標準正射投影函數,它允許您定義頂部,底部,左側,右側而不是寬度a第二高度,因此您可以翻轉Y軸任何你想要的方式:

此功能不會在OpenGLES 2.0存在,但您可以將公式複製到自己的正交函數:

http://www.opengl.org/sdk/docs/man/xhtml/glOrtho.xml

此外,如果這是Android(你的其他職位是針對Android,所以我會承擔如此),還有已經存在,你可以使用鄰矩陣功能(android.opengl.Matrix.orthoM

+0

我將如何設置的orthoM?這個'Matrix.orthoM(orthographicMatrix,0,0,w,h,0,-10f,10f);'似乎沒有給我我想要的效果? –

+0

@dnxviral這對我來說看起來很合適,你能說出它究竟是如何工作的嗎? – Tim

+0

@dnxviral:另外,也許可以考慮將你的着色器和統一代碼添加到原始文章中。你生成的矩陣看起來是從OpenGL通常使用的(tx,ty,tz通常是元素[12],[13]和[14],而不是[3],[7],[11 ]) – Tim