片段着色器中的条件语句

时间:2014-09-28 15:54:29

标签: android opengl-es opengl-es-2.0 shader

我对着色器的初学者很重要,所以我可能会遗漏一些明显的东西。我正在使用OpenGL ES 2.0编写Android应用程序。我尝试做的是根据碎片的实际r值来操纵碎片的颜色。简单的运动,但它让我在这里问我的第一个问题。基本代码如下所示:

void main() {
    vec4 tex = texture2D(u_TextureUnit, v_TextureCoordinates);
    float r = tex.r;
    float g = tex.g;
    float b = tex.b;

    if (tex.r > 0.5f) {
        r = 1;
    } else {
        r = 0;
    }

    gl_FragColor = vec4(r, g, b, tex.a);
}

问题是if-else块。当它在那里时,除了黑屏,我什么也得不到。删除后,对象会正确呈现,当然不会进行任何颜色修改。

当我删除if-else块并将最后一行更改为例如:

gl_FragColor = vec4(1, g, b, tex.a);

它的工作也很好,所以我猜测条件语句本身会产生问题。

如何修改片段的r值而不是不断使整个屏幕变黑?

1 个答案:

答案 0 :(得分:2)

您应该检查着色器编辑是否成功。执行此操作的代码将是这样的:

int[] statusVal = new int[1];
GLES20.glGetShaderiv(shaderId, GLES20.GL_COMPILE_STATUS, statusVal, 0);
if (statusVal[0] == GLES20.GL_FALSE) {
    String statusStr = GLES20.glGetShaderInfoLog(shaderId);
    // Look at statusStr to see error messages.
}

if声明中:

if (tex.r > 0.5f) {
    r = 1;
} else {
    r = 0;
}

有两个问题:

  1. ES 2.0中的GLSL版本中没有自动类型转换。 10的类型为int,您可以将它们分配给float变量。虽然这只是C和C ++等语言的坏习惯(恕我直言),但ES 2.0着色器不支持它。

  2. 0.5f不是有效的float常量。 ES 2.0着色器不支持f后缀。有些供应商允许您在不报告编译器错误的情况下使用它,其他供应商将正确地使着色器编译失败。

  3. 修复了这两个问题后,代码将如下所示:

    if (tex.r > 0.5) {
        r = 1.0;
    } else {
        r = 0.0;
    }