0

我在 OpenGL ES 2.0 中有一个投影,但不幸的是我希望 Y 为正值,这样我更容易使用 TouchEvents。

现在这是投影矩阵:

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 库:

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

并将我的顶点着色器更改为:

gl_Position = u_MVPMatrix * a_position;
4

1 回答 1

1

我建议只使用 OpenGL 的标准正交投影功能,它允许您定义顶部、底部、左侧、右侧,而不仅仅是宽度和高度,因此您可以以任何您想要的方式翻转 Y 轴:

此函数在 OpenGLES 2.0 中不存在,但您可以将方程复制到您自己的正交函数中:

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

此外,如果这是针对 Android 的(您的其他帖子是针对 android 的,所以我假设是这样),已经存在一个可以使用的正交矩阵函数 ( android.opengl.Matrix.orthoM)

于 2012-08-28T18:46:12.900 回答