0

我正在尝试在屏幕上绘制一个带纹理的正方形,但是每当我尝试使用glGetAttribLocation它时,它都会给我一个runtimeExceptionand glError 1280。我不知道为什么在三星 Galaxy S 3 等新终端设备上进行测试时,没有发现错误。但是在我的其他测试设备上,这个错误一直出现。

这是我的顶点着色器:

uniform mat4 uMVPMatrix;
attribute vec4 aPosition;     
attribute vec2 aTextureCoord;
varying vec2 vTextureCoord;
void main() {

gl_Position = uMVPMatrix * aPosition;
vTextureCoord = aTextureCoord;

}

和我的片段着色器:

precision mediump float;
varying vec2 vTextureCoord;
uniform sampler2D sTexture;
void main() {

 gl_FragColor = texture2D(sTexture, vTextureCoord);

}

这就是发生错误的地方:

    private void initProgram() {
    mProgram = createProgram(mVertexShader, mFragmentShader);
    if (mProgram == 0) {
        return;
    }
    maPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition");
    checkGlError("glGetAttribLocation aPosition");
    if (maPositionHandle == -1) {
        throw new RuntimeException(
                "Could not get attrib location for aPosition");
    }
    maTextureHandle = GLES20.glGetAttribLocation(mProgram, "aTextureCoord");
    checkGlError("glGetAttribLocation aTextureCoord");
    if (maTextureHandle == -1) {
        throw new RuntimeException(
                "Could not get attrib location for aTextureCoord");
    }

    muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
    checkGlError("glGetUniformLocation uMVPMatrix");
    if (muMVPMatrixHandle == -1) {
        throw new RuntimeException(
                "Could not get attrib location for uMVPMatrix");
    }

}

检查 GLError 时,我得到以下异常:

12-31 21:07:56.836: E/ChizEngine(27809): glGetAttribLocation aPosition: glError 1280
12-31 21:07:56.856: W/dalvikvm(27809): threadid=9: thread exiting with uncaught exception (group=0x4001d560)
12-31 21:07:56.856: E/AndroidRuntime(27809): FATAL EXCEPTION: GLThread 10
12-31 21:07:56.856: E/AndroidRuntime(27809): java.lang.RuntimeException: glGetAttribLocation aPosition: glError 1280
12-31 21:07:56.856: E/AndroidRuntime(27809):    at test.projects.ogc.util.GLHelper.checkGlError(GLHelper.java:13)
12-31 21:07:56.856: E/AndroidRuntime(27809):    at test.projects.ogc.objects.GameObject.initProgram(GameObject.java:168)
12-31 21:07:56.856: E/AndroidRuntime(27809):    at test.projects.ogc.objects.GameObject.Draw(GameObject.java:206)
12-31 21:07:56.856: E/AndroidRuntime(27809):    at test.projects.ogc.util.ChizRenderer.drawObjects(ChizRenderer.java:110)
12-31 21:07:56.856: E/AndroidRuntime(27809):    at test.projects.ogc.util.ChizRenderer.onDrawFrame(ChizRenderer.java:42)
12-31 21:07:56.856: E/AndroidRuntime(27809):    at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1363)
12-31 21:07:56.856: E/AndroidRuntime(27809):    at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1118)

当我打电话时出现glGetAttribLocation,知道为什么吗?

如果需要更多信息,请告诉我,我现在已经尝试了几个小时,但完全没有成功,而且,我在银河系 3 上根本没有收到任何错误,这很奇怪

顺便说一句,我在渲染器中的initProgram函数上调用该函数。onSurfaceCreated

显然错误是它checkGLError本身(下面的代码),在从应用程序中删除函数的每次调用后,它在我检查的每台设备上都按预期工作!

checkGLError功能:

    public static void checkGlError(String op) {
    int error;
    while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) {
        Log.e(TAG, op + ": glError " + error);
        throw new RuntimeException(op + ": glError " + error);
    }
}

我的假设是,该函数中的某些内容是为更高的 api 制作的,该 2.3 android 设备不支持该应用程序已检查,这就是它在 4.1.3 android 设备上运行良好的原因。

我应该完全从我的应用程序中排除该功能吗?

4

1 回答 1

0

如果您检查规范,glGetAttribLocation不会产生INVALID_ENUM错误 (1280),这可能意味着问题出在其他地方。

  • checkGlError在程序创建期间和之后放置一个。
  • 确保checkGlError包含对 glGetError 的循环调用
于 2013-05-17T06:23:36.287 回答