Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Android设备上运行OpenGL ES 2程序时出现致命错误,但在仿真器上没有_Java_Android_Opengl Es_Android Emulator - Fatal编程技术网

Java 在Android设备上运行OpenGL ES 2程序时出现致命错误,但在仿真器上没有

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

我正在使用OpenGL ES 2.0在Android上开发一款突破式游戏,我遇到了一个致命错误,这个错误只发生在我的Android设备版本2.3.4上,而没有发生在我的模拟器Android版本5.0.1上。我最初认为错误在于版本的不同,但我并不完全相信

我让游戏在emulator和我的设备上都运行得很好,但是当我想添加一个粒子效果着色器时出现了问题,在编译第二个着色器的过程中,我收到了一个运行时异常,如下面的堆栈跟踪所示

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?