2014-12-19 4 views
0

Я пытаюсь использовать простой шейдер glsl, загруженный из файла. Это то, что у меня есть:Шиндеры OpenGL компилируют ошибку мусора

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, чтобы отладить мой шейдер?

ответ

2

Как вы уверены, что файл не содержит более 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); 
+0

Ну, я нашел ошибку где-то еще, но спасибо за указание на проблему размера файла. – ghi

+2

Вы можете ответить на свой вопрос. –

1

Это не должно даже компилируется, если у вас есть какие-либо строгой проверки ошибок. По крайней мере, это должно дать вам предупреждение, если у вас есть разумный уровень предупреждения.

В этом вызове:

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

3-й аргумент имеет неправильный тип. Прототип glShaderSource() является:

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

Обратите внимание, что третий аргумент является указателем на указатель, в то время как вы передаете массив, который распадается на указатель, когда вы передаете его в качестве аргумента функции.

Вызов должен быть:

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