【问题标题】:OpenGL shaders compile garbage errorOpenGL着色器编译垃圾错误
【发布时间】:2014-12-19 12:45:11
【问题描述】:

我正在尝试使用从文件加载的简单 glsl 着色器。这就是我所拥有的:

GLuint
shdld(char *path) {
    GLuint shd;
    GLint cflag, nlog;
    FILE *fp;
    int i, c;
    GLchar source[1000], elog[1000];


    fp = fopen(path, "r");
    if (fp == NULL) {
        printf("Unable to open file %s\n", path);
        return 0;
    }

    for (i = 0; (c = getc(fp)) != EOF; i++)
        source[i] = c;
    source[i++] = '\0';

    fclose(fp);

    shd = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(shd, 1, source, NULL);
    glCompileShader(shd);

    cflag = GL_FALSE;
    glGetShaderiv(shd, GL_COMPILE_STATUS, &cflag);
    if (cflag == GL_FALSE) {
        glGetShaderInfoLog(shd, sizeof elog, NULL, elog);
        printf("Unable to compile shader %s\n", path);
        printf("%s\n", elog);
        glDeleteShader(shd);
        return 0;
    }
    return shd;

}

不幸的是,着色器无法编译,更糟糕的是,elog 包含一些垃圾内容,而不是日志消息。我的问题是:如何获取错误消息并将其显示到标准输出中以调试我的着色器?

【问题讨论】:

    标签: c opengl gcc glut opengl-4


    【解决方案1】:

    你如何确定文件包含的字符不超过1000,要么增加缓冲区大小,要么

    改变这部分

    for (i = 0; (c = getc(fp)) != EOF; i++)
        source[i] = c;
    source[i++] = '\0';
    

    如果您只是获取文件大小,这是一种可能的获取方式

    size_t fileSize;
    
    fseek(fp, 0, SEEK_END);
    fileSize = ftell(fp);
    rewind(fp);
    

    那么你可以将source声明为GLchar *source,并动态分配它

    source = malloc((1 + fileSize) * sizeof(GLchar));
    if (source == NULL) /* always check the output of malloc */
        return SOME_INVALIDE_GLuint;
    source[fileSize] = '\0';     
    

    然后

    fread(source, szeof(GLchar), fileSize, fp); // check return value to ensure fileSize bytes were read
    fclose(fp);
    

    最后别忘了

    free(source);
    

    【讨论】:

    • 好吧,我在其他地方发现了这个错误,但感谢您指出文件大小问题。
    • 你可以回答你自己的问题。
    【解决方案2】:

    如果你有任何严格的错误检查,这甚至不应该编译。如果您启用了合理的警告级别,它至少应该给您一个警告。

    在本次通话中:

    GLchar source[1000], elog[1000];
    ...
    glShaderSource(shd, 1, source, NULL);
    

    第三个参数的类型错误。 glShaderSource()的原型是:

    void glShaderSource(GLuint shader, GLsizei count, const GLchar **string, const GLint *length);
    

    请注意,第三个参数是指向指针的指针,当您传递一个数组时,当您将它作为函数参数传递时,它会衰减为一个指针。 p>

    调用需要是:

    GLchar* sourcePtr = source;
    glShaderSource(shd, 1, &sourcePtr, NULL);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-30
      相关资源
      最近更新 更多