簡體   English   中英

OpenGL着色器編譯垃圾錯誤

[英]OpenGL shaders compile garbage error

我正在嘗試使用從文件加載的簡單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包含一些垃圾內容,而不是日志消息。 我的問題是:如何獲取錯誤消息並將其顯示到stdout中,以便調試着色器?

您如何確定文件中的字符數不能超過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);

如果您進行任何嚴格的錯誤檢查,它甚至都不會編譯。 如果啟用了合理的警告級別,它至少應該給您警告。

在此通話中:

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

第三個參數的類型錯誤。 glShaderSource()的原型是:

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

請注意,當您傳遞數組時,第3個參數是指向指針的指針 ,當將其作為函數參數傳遞時,它會衰減為指針

呼叫必須為:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM