2015-03-31 81 views
0

我正在使用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功能。正如我之前提到的,应用程序在我的设备上运行良好,直到我引入了粒子着色器。它继续在我的模拟器上运行的事实让我感到困惑。我用我的设备或着色器的版本来计算它的东西,但我无法弄清楚。

回答

0

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? 

并称日志功能会给你更多的使用,而工作不仅仅是猜测。

+0

顶点着色器中不需要默认精度。只有片段着色器没有'float'的默认精度。在顶点着色器中,它们默认为'highp'。 – 2015-04-29 15:21:34

相关问题