创建程序并尝试获取属性位置时出错| Opengl ES 2.0 Android

创建程序并尝试获取属性位置时出错| Opengl ES 2.0 Android,android,opengl-es,opengl-es-2.0,fragment-shader,vertex-shader,Android,Opengl Es,Opengl Es 2.0,Fragment Shader,Vertex Shader,我试图在屏幕上绘制一个带纹理的正方形,但每当我尝试使用glGetAttriblLocation时,它都会给我一个runtimeException和glError 1280。我不知道为什么在一个新的终端设备上测试时,比如三星GalaxyS3,没有发现错误。但在我的其他测试设备上,这个错误不断出现 这是我的顶点着色器: uniform mat4 uMVPMatrix; attribute vec4 aPosition; attribute vec2 aTextureCoord; varyi

我试图在屏幕上绘制一个带纹理的正方形,但每当我尝试使用
glGetAttriblLocation
时,它都会给我一个
runtimeException
glError 1280
。我不知道为什么在一个新的终端设备上测试时,比如三星GalaxyS3,没有发现错误。但在我的其他测试设备上,这个错误不断出现

这是我的顶点着色器:

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)
当我调用
glGetAttriblLocation
时,它会出现,你知道为什么吗

如果需要更多的信息,请告诉我,到目前为止,我已经花了几个小时试图解决这个问题,但没有成功。而且,奇怪的是,我在星系S3上一点错误都没有

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

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

检查错误
功能:

    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而设计的,而该api不受2.3 android设备的支持,这就是为什么它在4.1.3 android设备上运行良好的原因


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

如果检查规范,
glGetAttribLocation
不会产生
无效的\u ENUM
错误(1280),这可能意味着问题在其他地方

  • 在程序创建期间和之后放置一个
    复选框
  • 确保
    checklerror
    包含对glGetError的循环调用

好的,我已经做了所有这些,但是我注意到我在放置
checklerror
函数的地方没有遇到错误,所以我禁用了所有函数调用,现在它工作得非常好!我将把
checklerror
的代码放在我的问题中