在Android设备上运行OpenGL ES 2程序时发生致命错误,但未在仿真器上运行
问题描述:
我正在使用OpenGL ES 2.0在Android上开发突破风格游戏,并且遇到仅在我的Android设备上发生的致命错误(版本2.3.4),但不会发生在我的模拟器(Android版本5.0.1)上。我首先想到的是这个bug与版本的差异,但我并不完全相信。在Android设备上运行OpenGL ES 2程序时发生致命错误,但未在仿真器上运行
我的游戏在模拟器和我的设备上都能很好地工作,但是当我想添加一个粒子效果着色器,并且在编译第二个着色器时收到RunTime异常下面。
03-31 15:50:52.339 24359-24371/com.package E/GLSLProgram Class﹕ glAttachShader: glError 1281
03-31 15:50:52.359 24359-24371/com.package W/dalvikvm﹕ threadid=9: thread exiting with uncaught exception (group=0x40018560)
03-31 15:50:52.359 24359-24371/com.package E/AndroidRuntime﹕ FATAL EXCEPTION: GLThread 10
java.lang.RuntimeException: glAttachShader: glError 1281
at com.package.GLSLProgram.checkGlError(GLSLProgram.java:55)
at com.package.GLSLProgram.<init>(GLSLProgram.java:38)
at com.package.ResourceManager.insertShader(ResourceManager.java:103)
at com.package.GameRenderer.onSurfaceCreated(GameRenderer.java:69)
at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1349)
at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1119)
03-31 15:50:52.369 24359-24359/com.package D/GameActivity﹕ in onPause
03-31 15:50:52.729 24359-24359/com.package E/libEGL﹕ call to OpenGL ES API with no current context (logged once per thread)
我有,我经过多次OpenGL的方法调用调用Android OpenGL ES 2 tutorial的方法(尤其是那些我不想引起问题):
public static void checkGlError(String glOperation)
{
int error;
while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) {
Log.e(TAG, glOperation + ": glError " + error);
throw new RuntimeException(glOperation + ": glError " + error);
}
}
我注意到堆栈跟踪说在着色器编译(glAttachShader)后出现错误。如果我注释掉checkGlError函数,那么程序不会崩溃,但我试图创建的粒子效果不会显示,这意味着着色器没有编译。因此,我认为问题在于粒子顶点和片段着色器,但是这些在仿真器上按照预期进行编译和运行。下面是粒子的顶点和片段着色器:
顶点:
attribute vec4 aVertex; // vec2 position, vec2 tex coords
varying vec2 vTexCoords;
varying vec4 vParticleColor;
uniform mat4 uParticleProjection;
uniform vec2 uParticleOffset;
uniform vec4 uParticleColor;
void main() {
float scale = 10.0f;
vTexCoords = aVertex.zw;
vParticleColor = uParticleColor;
gl_Position = uParticleProjection * vec4((aVertex.xy * scale) + uParticleOffset, 0.0, 1.0);
}
片段:
precision mediump float;
varying vec2 vTexCoords;
varying vec4 vParticleColor;
uniform sampler2D uParticle;
void main() {
gl_FragColor = vParticleColor * texture2D(uParticle, vTexCoords);
}
我在我的清单启用的OpenGL ES 2功能。正如我之前提到的,应用程序在我的设备上运行良好,直到我引入了粒子着色器。它继续在我的模拟器上运行的事实让我感到困惑。我用我的设备或着色器的版本来计算它的东西,但我无法弄清楚。
答
是this函数暴露在Java OpenGL API中吗?如果是这样,您可以从驱动程序中获取编译日志,并找出它为什么不编译的原因。
在猜测,但:
float scale = 10.0f;
// should be ->
float scale = 10.0;
precision mediump float; // This should be in the vertex shader also?
并称日志功能会给你更多的使用,而工作不仅仅是猜测。
顶点着色器中不需要默认精度。只有片段着色器没有'float'的默认精度。在顶点着色器中,它们默认为'highp'。 – 2015-04-29 15:21:34