我有一個非常奇怪的問題,我的問題在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() ; - 它返回一個零,就像沒有錯誤(因爲我沒有得到任何錯誤信息) - 我的着色器仍然無法編譯:(
你怎麼知道你的設備支持OpenGL ES 2.0作爲在的Android 2.3是可選的。每次調用後檢查fragmentShaderHandler的值。 – 2014-09-25 21:30:12
哎呀沒有看到外部fragementShaderHandler有條件。 – 2014-09-25 21:42:26
你試過調用'glGetError()'嗎?我想知道是否有什麼東西可以搞砸,甚至不會嘗試編譯着色器。例如,由於某種原因,「fragmentShaderHandle」無效。 – 2014-09-26 03:08:23