我正在使用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功能。正如我之前提到的,應用程序在我的設備上運行良好,直到我引入了粒子着色器。它繼續在我的模擬器上運行的事實讓我感到困惑。我用我的設備或着色器的版本來計算它的東西,但我無法弄清楚。
頂點着色器中不需要默認精度。只有片段着色器沒有'float'的默認精度。在頂點着色器中,它們默認爲'highp'。 – 2015-04-29 15:21:34