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 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,776评论 25 709
  • 前言 在前文<OpenGL ES 创建窗口>中我们学习了如何在 iOS 平台上设置OpenGL ES 环境,主要是...
    RM_乾笙阅读 4,929评论 1 0
  • 译序 早前学OpenGL的时候还是1.x版本,用的都是glVertex,glNormal等固定管线API。后来工作...
    威士忌阅读 11,662评论 4 51
  • 1. 概述 Android通过使用Open Graphics Library(OpenGL®)提供了对高性能2D和...
    小芸论阅读 11,979评论 1 19
  • 我牵挂 小鸟依语的小山 小山里绿色环绕的木屋 木屋里枭枭的炊烟 炊烟里揉着眼晴的老妈 铃声拉晌了思念的琴弦 把音键...
    挑夫阅读 3,895评论 63 89