Java 在Android设备上运行OpenGL ES 2程序时出现致命错误,但在仿真器上没有
我正在使用OpenGL ES 2.0在Android上开发一款突破式游戏,我遇到了一个致命错误,这个错误只发生在我的Android设备版本2.3.4上,而没有发生在我的模拟器Android版本5.0.1上。我最初认为错误在于版本的不同,但我并不完全相信 我让游戏在emulator和我的设备上都运行得很好,但是当我想添加一个粒子效果着色器时出现了问题,在编译第二个着色器的过程中,我收到了一个运行时异常,如下面的堆栈跟踪所示Java 在Android设备上运行OpenGL ES 2程序时出现致命错误,但在仿真器上没有,java,android,opengl-es,android-emulator,Java,Android,Opengl Es,Android Emulator,我正在使用OpenGL ES 2.0在Android上开发一款突破式游戏,我遇到了一个致命错误,这个错误只发生在我的Android设备版本2.3.4上,而没有发生在我的模拟器Android版本5.0.1上。我最初认为错误在于版本的不同,但我并不完全相信 我让游戏在emulator和我的设备上都运行得很好,但是当我想添加一个粒子效果着色器时出现了问题,在编译第二个着色器的过程中,我收到了一个运行时异常,如下面的堆栈跟踪所示 03-31 15:50:52.339 24359-24371/com.p
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)
我注意到堆栈跟踪显示错误发生在着色器编译glAttachShader之后。如果我注释掉checkleror函数,那么程序不会崩溃,但是我尝试创建的粒子效果不会显示,这意味着着色器没有编译。因此,我假设问题在于粒子顶点和片段着色器,但这些着色器在模拟器上按照预期编译和运行。以下是粒子顶点和片段着色器:
顶点:
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功能。如前所述,在我引入粒子着色器之前,该应用程序在我的设备上运行良好。它继续在我的模拟器上运行的事实让我感到困惑。我认为这与我的设备版本或着色器有关,但我无法理解 函数是否在Java OpenGL API中公开?如果是这样,您可以从驱动程序中获取编译日志,并找出它不编译的确切原因
不过我猜:
float scale = 10.0f;
// should be ->
float scale = 10.0;
precision mediump float; // This should be in the vertex shader also?
添加日志函数将为您提供更多的操作,而不仅仅是猜测。顶点着色器中不需要默认精度。只有片段着色器没有浮点的默认精度。在顶点着色器中,它们默认为highp。
float scale = 10.0f;
// should be ->
float scale = 10.0;
precision mediump float; // This should be in the vertex shader also?