Android 2.3 - 无法编译openGL 2.0 ES片段着色器

时间:2014-09-25 20:45:02

标签: android android-fragments opengl-es

我对android 2.3.3上的问题有一个非常奇怪的问题 - 我尝试编译一个基本的片段着色器,但编译器给出了一个0作为compileStatus。

这是我的着色器编译片段:

    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)我添加了一个检查,看看该设备是否与openGL 2.0兼容 - 每个经过测试的设备都说好了:

boolean supportsEs2 = configurationInfo.reqGlEsVersion >= 0x20000;

3)我尝试了int glError = GLES20.glGetError(); - 它返回一个零,就像没有错误一样(因为我也没有得到任何错误信息) - 我的着色器仍然无法编译:(

1 个答案:

答案 0 :(得分:1)

不确定为什么您没有从glGetShaderInfoLog()获取错误字符串,而是您的"最简单的片段着色器"包含多个错误:

void main { gl_FragmentColor = vec4(1.0f, 1.0f, 1.0f, 1.0f) }
  • 需要花车的精确限定符。
  • main之后需要空括号。
  • 预定义的输出变量为gl_FragColor,而不是gl_FragmentColor
  • 1.0f不是ES 2.0中的有效常量。必须是1.0
  • 声明后分号丢失。

正确的版本是:

precision mediump float;
void main() { gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); }
相关问题