2014-09-25 193 views
0

我有一個非常奇怪的問題,我的問題在android 2.3.3 - 我嘗試編譯基本片段着色器,但編譯器給出了一個0作爲compileStatus。Android 2.3 - 不能編譯openGL 2.0 ES片段着色器

這裏是我的着色器編譯的代碼片段:

if (fragmentShaderHandle != 0) { 

     // Pass in the shader source. 
     GLES20.glShaderSource(fragmentShaderHandle, fragmentShader); 

     // Compile the shader. 
     GLES20.glCompileShader(fragmentShaderHandle); 

     // Get the compilation status. 
     final int[] compileStatus = new int[1]; 
     GLES20.glGetShaderiv(fragmentShaderHandle, GLES20.GL_COMPILE_STATUS, compileStatus, 0); 

     // If the compilation failed, delete the shader. 
     if (compileStatus[0] == 0) { 

      ErrorLog = GLES20.glGetShaderInfoLog(fragmentShaderHandle); 

      GLES20.glDeleteShader(fragmentShaderHandle); 
      fragmentShaderHandle = 0; 
     }   
    } 

    if (fragmentShaderHandle == 0) { 

     throw new RuntimeException("Error creating fragment shader. Error: " + ErrorLog); 
    } 

最奇怪的是,glGetShaderInfoLog給一個空字符串作爲一個錯誤 - 我沒有得到任何信息,其他則「錯誤創建片段着色器。」這是我的錯誤信息。如果我跳過那一行,那麼由於片段着色器不存在,程序綁定會給出錯誤。 (最簡單的着色器:void main {gl_FragmentColor = vec4(1.0f,1.0f,1.0f,1.0f)}}這給出了相同的着色器(如果有錯誤),但是即使是最簡單的着色器也不運行錯誤沒有任何錯誤信息)。

但是:這段代碼會在android 4.0上運行(我的朋友嘗試過它,並且它在模擬器中工作)。我問了一些與android 2.3的其他朋友 - 但每個人都沒有錯誤消息得到相同的錯誤。

電話支持OpenGL 2.0 ES - 如果我不加載着色器,只需清除屏幕,它工作得很好。

任何人有什麼想法,我應該從哪裏開始尋找?沒有錯誤信息,很難找到我弄亂的地方:|

謝謝!

編輯:

1)它成功地編譯vertexShader,而且,如果我不加載任何着色器,我可以明確使用GLES20.glClear(...)命令在屏幕上,它成功地運行在任何測試設備上。

2)I增加了一個檢查,以查看與openGL的2.0兼容的裝置 - 每個被測試設備,所述一切正常:

boolean supportsEs2 = configurationInfo.reqGlEsVersion >= 0x20000; 

3)I嘗試了INT glError = GLES20.glGetError() ; - 它返回一個零,就像沒有錯誤(因爲我沒有得到任何錯誤信息) - 我的着色器仍然無法編譯:(

+0

你怎麼知道你的設備支持OpenGL ES 2.0作爲在的Android 2.3是可選的。每次調用後檢查fragmentShaderHandler的值。 – 2014-09-25 21:30:12

+0

哎呀沒有看到外部fragementShaderHandler有條件。 – 2014-09-25 21:42:26

+0

你試過調用'glGetError()'嗎?我想知道是否有什麼東西可以搞砸,甚至不會嘗試編譯着色器。例如,由於某種原因,「fragmentShaderHandle」無效。 – 2014-09-26 03:08:23

回答

1

不知道爲什麼你沒有從glGetShaderInfoLog()得到錯誤字符串,但你的「最簡單片段着色器」包含多個錯誤:

void main { gl_FragmentColor = vec4(1.0f, 1.0f, 1.0f, 1.0f) } 
  • 需求精度限定符浮點數
  • 需要空括號main
  • 預定義的輸出變量爲gl_FragColor,不。。
  • 1.0f在ES 2.0中不是一個有效的常量。必須是1.0
  • 分號後陳述缺失。

正確的版本是:

precision mediump float; 
void main() { gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); } 
相關問題