我正在尝试在屏幕上绘制一个带纹理的正方形,但是每当我尝试使用glGetAttribLocation
它时,它都会给我一个runtimeException
and 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 设备上运行良好的原因。
我应该完全从我的应用程序中排除该功能吗?