我对着色器的初学者很重要,所以我可能会遗漏一些明显的东西。我正在使用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值而不是不断使整个屏幕变黑?
答案 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;
}
有两个问题:
ES 2.0中的GLSL版本中没有自动类型转换。 1
和0
的类型为int
,您可以将它们分配给float
变量。虽然这只是C和C ++等语言的坏习惯(恕我直言),但ES 2.0着色器不支持它。
0.5f
不是有效的float
常量。 ES 2.0着色器不支持f
后缀。有些供应商允许您在不报告编译器错误的情况下使用它,其他供应商将正确地使着色器编译失败。
修复了这两个问题后,代码将如下所示:
if (tex.r > 0.5) {
r = 1.0;
} else {
r = 0.0;
}