2014-12-19 6 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

이 어떻게 당신이 단순히 파일 크기를 얻을 경우 파일이 부분

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

개 이상의 1000 문자를 포함, 중 버퍼 크기를 늘리거나

변경하지 않는 것을 확신이있다 한 가지 가능한 방법은

size_t fileSize; 

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

다음 GLchar *sourcesource을 선언 할 수 있습니다 얻을, 동적으로 할당하기 동맹

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()의 프로토 타입은 다음과 같습니다 3 인수 당신이 포인터에 붕괴 배열을 통과하는 동안 함수 인수로 전달하면, 포인터에 포인터

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

하는 것으로.

호출은 할 필요가 :

GLchar* sourcePtr = source; 
glShaderSource(shd, 1, &sourcePtr, NULL); 
관련 문제