【发布时间】:2014-08-21 11:47:55
【问题描述】:
我正在使用 OpenGL ES 2.0 开发一个 Android 应用程序。它由覆盖在 3D 场景上的 2D HUD 组成。 3D 部分一切正常,但在 2D 中绘制时,我无法弄清楚 如何将原点定位在屏幕的左上角(y 轴朝下)。现在我的原点位于屏幕的中心,我只是在绘制时从坐标中减去一半的宽度和高度。 (我知道这是一个 hacky 解决方案,我想解决这个问题!)
以下是相关代码:
GLES20.glViewport(0, 0, surfaceWidth, surfaceHeight);
Matrix.orthoM(projectionMatrix, 0, -width / 2, width / 2, height / 2, -height / 2, -1, 1);
Matrix.setLookAtM(viewMatrix, 0, 0, 0, 2f, 0, 0, 0, 0, -1, 0);
Matrix.multiplyMM(mvpMatrix, 0, projectionMatrix, 0, viewMatrix, 0);
以下是相关的着色器:
private final static String vertexShaderCode =
"uniform mat4 uMVPMatrix;" +
"attribute vec2 aTexCoordinate;" +
"varying vec2 vTexCoordinate;" +
"attribute vec4 aPosition;" +
"attribute vec4 aColor;" +
"varying vec4 vColor;" +
"void main() {" +
" vColor = aColor;" +
" vTexCoordinate = aTexCoordinate;" +
" gl_Position = aPosition * uMVPMatrix;" +
"}";
private final static String fragmentShaderCode =
"precision mediump float;" +
"uniform sampler2D uTexture;" +
"varying vec2 vTexCoordinate;" +
"varying vec4 vColor;" +
"void main() {" +
" gl_FragColor = vColor * texture2D(uTexture, vTexCoordinate);" +
"}";
我尝试过的:
-
我尝试过使用这条线:
Matrix.orthoM(projectionMatrix, 0, 0, width, height, 0, -1, 1); 我尝试将原点定位在左下角,而不是左上角(我不应该这样做,但我还是尝试了)。
我已尝试在顶点着色器的倒数第二行中切换
aPosition和uMVPMatrix的顺序。
这三个更改的组合没有解决我的问题(2D 对象不渲染)。
我尝试的另一件事是将原点设置为偏离中心 1 个像素,然后是 2 个像素,然后是 3 个,依此类推。我越偏离中心,图像就会不断倾斜,最终变得太薄而无法看到 - 但那仍然没有告诉我如何解决这个问题。
同样,问题是:如何在 OpenGL ES 2.0 中将原点定位在左上角?
附:我的合同(第一份工作!)于 7 月 29 日到期,所以我很快就需要一个答复;我不想给下一个人留下这样的 hacky 修复。
【问题讨论】: