查看: 7702|回复: 2

GLSL教程(8) 调试手段

[复制链接]
  • TA的每日心情
    开心
    2019-11-11 10:36
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2009-6-3 00:23:00 | 显示全部楼层 |阅读模式
    GLSL教程

    译:FreeSouth
    调试手段


    Shader调试是非常困难的,没有像printf这种函数,而且可能永远都不会有。你也可以使用一些工具来设计shader,那也是可行的。所幸的是现实中也有一些函数可以来判断是否编译和链接成功。
    可以查看编译状态的函数,OpenGL2.0语法:
    ________________________________________
    void glGetShaderiv(GLuint object, GLenum type, int *param);
    参数:
    object - the handler to the object. Either a shader or a program
    type - GL_COMPILE_STATUS.
    param - the return value, GL_TRUE if OK, GL_FALSE otherwise.
    ________________________________________
    链接状态的函数:
    ________________________________________
    void glGetProgramiv(GLuint object, GLenum type, int *param);
    参数:
    object - the handler to the object. Either a shader or a program
    type - GL_LINK_STATUS.
    param - the return value, GL_TRUE if OK, GL_FALSE otherwise.
    ________________________________________
    ARB中使用下面的函数来查看编译和链接状态,区别在参数:
    ________________________________________
    oid glGetObjectParameterivARB(GLhandleARB object, GLenum type, int *param);
    参数:
    object - the handler to the object. Either a shader or a program
    type - GL_OBJECT_LINK_STATUS_ARB or GL_OBJECT_COMPILE_STATUS_ARB.
    param - the return value, 1 for OK, 0 for problems.
    ________________________________________
    关于第二个参数type,有很多操作,但是这里不一一例举,可以到3Dlabs网站上查看详情。
    当错误发生时,可以使用InfoLog来查看更多信息。这个Log存放的一些在编译和链接阶段错误和告警信息。甚至可以捕捉到shader在运行时一具体的硬件的信息,比如硬件不支持什么什么了等等。不幸的是对于InfoLog没有什么统一的规则,不同的硬件与驱动产生的InfoLog也会不同。
    可以使用下面的函数来得到shader和program的InfoLog,OpenGL2.0:
    ________________________________________
    void glGetShaderInfoLog(GLuint object, int maxLen, int *len, char *log);
    void glGetProgramInfoLog(GLuint object, int maxLen, int *len, char *log);
    参数:
    object - the handler to the object. Either a shader or a program
    maxLen - The maximum number of chars to retrieve from the InfoLog.
    len - returns the actual length of the retrieved InfoLog.
    log - The log itself.
    ________________________________________
    ARB一个函数就搞定了:
    ________________________________________
    void glGetInfoLogARB(GLhandleARB object, int maxLen, int *len, char *log);
    参数:
    object - the handler to the object. Either a shader or a program
    maxLen - The maximum number of chars to retrieve from the InfoLog.
    len - returns the actual length of the retrieved InfoLog.
    log - The log itself.
    ________________________________________
    GLSL在这点上显得有点小强,你可以利用下面的函数来得到你收到的Log的长度信息:
    ________________________________________
    void glGetShaderiv(GLuint object, GLenum type, int *param);
    void glGetProgramiv(GLuint object, GLenum type, int *param);
    参数:
    object - the handler to the object. Either a shader or a program
    type - GL_INFO_LOG_LENGTH.
    param - the return value, the length of the InfoLog.
    ________________________________________
    ARB扩展:
    ________________________________________
    void glGetObjectParameterivARB(GLhandleARB object, GLenum type, int *param);
    参数:
    object - the handler to the object. Either a shader or a program
    type - GL_OBJECT_INFO_LOG_LENGTH_ARB.
    param - the return value, the length of the InfoLog.
    ________________________________________
    OpenGL 2.0使用下面的函数来打印InfoLog的内容:
    ________________________________________
            void printShaderInfoLog(GLuint obj)
            {
                int infologLength = 0;
                int charsWritten  = 0;
                char *infoLog;

                    glGetShaderiv(obj, GL_INFO_LOG_LENGTH,&infologLength);

                if (infologLength > 0)
                {
                    infoLog = (char *)malloc(infologLength);
                    glGetShaderInfoLog(obj, infologLength, &charsWritten, infoLog);
                            printf("%s\n",infoLog);
                    free(infoLog);
                }
            }

            void printProgramInfoLog(GLuint obj)
            {
                int infologLength = 0;
                int charsWritten  = 0;
                char *infoLog;

                    glGetProgramiv(obj, GL_INFO_LOG_LENGTH,&infologLength);

                if (infologLength > 0)
                {
                    infoLog = (char *)malloc(infologLength);
                    glGetProgramInfoLog(obj, infologLength, &charsWritten, infoLog);
                            printf("%s\n",infoLog);
                    free(infoLog);
                }
            }
    ________________________________________
    ARB则使用下面的函数:
    ________________________________________
            void printInfoLog(GLhandleARB obj)
            {
                int infologLength = 0;
                int charsWritten  = 0;
                char *infoLog;
           
                glGetObjectParameterivARB(obj, GL_OBJECT_INFO_LOG_LENGTH_ARB,
                                                     &infologLength);
           
                if (infologLength > 0)
                {
                    infoLog = (char *)malloc(infologLength);
                    glGetInfoLogARB(obj, infologLength, &charsWritten, infoLog);
                            printf("%s\n",infoLog);
                    free(infoLog);
                }
            }


    ________________________________________
    原文地址:http://www.lighthouse3d.com/opengl/glsl/index.php?oglinfo
    调试手段.pdf (189.63 KB, 下载次数: 690)

    该用户从未签到

    发表于 2009-6-3 08:50:07 | 显示全部楼层
    赞~~~~~~~~~ :) :)

    该用户从未签到

    发表于 2013-9-25 11:46:31 | 显示全部楼层

    谢谢! 学习啊!
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    OSG中国官方论坛-有您OSG在中国才更好

    网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

    联系我们

    • 工作时间:09:00--18:00
    • 反馈邮箱:1315785073@qq.com
    快速回复 返回顶部 返回列表