2014-09-25 125 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); }