2015-03-31 107 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

相關問題