Android OpenGL 渲染黑屏调试技巧

关键词: 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

你可能感兴趣的:(Android OpenGL 渲染黑屏调试技巧)