我对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(); - 它返回一个零,就像没有错误一样(因为我也没有得到任何错误信息) - 我的着色器仍然无法编译:(
答案 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); }