关键词: android, opengl, glsl, shader
调试过程中积累了不少 bug 案例看这里.
由于 shader 脚本的编译和 android java 代码的编译运行是分离的, 所以 shader 脚本的无法断点调试或输出 log.
这里再分享一个定位 shader 编译 bug 的方法, 通常这也是造成渲染黑屏的主要原因.
1 编译错误
解法来自于 android-gpuimage 源码:
public static int loadShader(final String strSource, final int iType) {
int[] compiled = new int[1];
int iShader = GLES20.glCreateShader(iType);
GLES20.glShaderSource(iShader, strSource);
GLES20.glCompileShader(iShader);
GLES20.glGetShaderiv(iShader, GLES20.GL_COMPILE_STATUS, compiled, 0);
if (compiled[0] == 0) {
Log.d("Load Shader Failed", "Compilation\n" + GLES20.glGetShaderInfoLog(iShader));
return 0;
}
return iShader;
}
在加载 shader 脚本的时候会返回 shader 的编译错误信息, 只需要过滤这里的 log 即可知道 shader 脚本出了什么语法错误.
看看 OpenGL 参考文档, 发现有这么2个可用的 log 输出接口:
glGetShaderInfoLog — Returns the information log for a shader object
glGetProgramInfoLog — Returns the information log for a program object
2 运行输出
如果想把运行结果以日志的形式输出到图像里, 在 StackOverFlow 上找了一圈发现也是可以做到的, 参考如下脚本:
void output(int x, int y, float r, float g, float b, int font, char *string)
{
glColor3f( r, g, b );
glRasterPos2f(x, y);
int len, i;
len = (int)strlen(string);
for (i = 0; i < len; i++) {
glutBitmapCharacter(font, string[i]);
}
}
这里 有篇文章甚至能让其显示中文字符, 666