【问题标题】:error when creating program and trying to get attribute Location | Opengl ES 2.0 Android创建程序并尝试获取属性 Location | 时出错Opengl ES 2.0 安卓
【发布时间】:2013-05-17 00:16:07
【问题描述】:

我正在尝试在屏幕上绘制一个带纹理的正方形,但每当我尝试使用glGetAttribLocation 时,它都会给我一个runtimeExceptionglError 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 时出现,知道为什么吗?

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

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

显然错误是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 设备上运行良好的原因。

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

【问题讨论】:

    标签: android opengl-es opengl-es-2.0 fragment-shader vertex-shader


    【解决方案1】:

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

    • 在程序创建期间和之后放置checkGlError
    • 确保checkGlError 包含对glGetError 的循环调用

    【讨论】:

    • 好的,所以我已经完成了所有这些,但我注意到我在放置 checkGLError 函数的位置时得到了错误,所以我禁用了该函数的所有调用,现在它工作得很好!我会把checkGLError的代码放在我的问题中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多