2017-07-14 4 views
1

Ich arbeite von einer Code-Basis, die ich weiß, kompiliert korrekt. Momentan habe ich einen gezielten Schreibfehler in meinen Shader eingefügt, um einen Fehler zu simulieren. An diesem Punkt verweigert der Code die Kompilierung. Ich kann dann rufenWarum gibt glGetProgramInfoLog eine leere Zeichenfolge zurück?

glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &params); 

zu finden, dass params ist jetzt 108, wo war zuvor 0, so dass ich weiß, dass es ein Protokoll mit diesem Shader zugeordnet ist (was ich versucht habe zu kompilieren). Allerdings, wenn ich rufe

glGetProgramInfoLog(shader, 512, &size, ErrorLog); 

size 0 zurück, und ErrorLog ist noch leer.

Hier ist der wichtige Code in dieser Situation:

void Shader::AddShader(GLuint ShaderProgram, const char* pShaderText, GLenum ShaderType) 
{ 
    GLuint ShaderObj = glCreateShader(ShaderType); 
    if (ShaderObj == 0) { 
     fprintf(stderr, "Error creating shader type %d\n", ShaderType); 
     exit(1); 
    } 
    const char* pShaderSource = readShaderSource(pShaderText); 
    glShaderSource(ShaderObj, 1, (const GLchar**)&pShaderSource, NULL); 
    glCompileShader(ShaderObj); 
    checkCompileError(ShaderObj, ShaderType); 
    glAttachShader(ShaderProgram, ShaderObj); 
} 


bool Shader::checkCompileError(GLuint shader, GLenum ShaderType) 
{ 
    GLint params = -1; 
    GLchar ErrorLog[512] = { 0 }; 
    GLint size = 0; 
    glGetShaderiv(shader, GL_COMPILE_STATUS, &params); 
    if (GL_TRUE != params) { 
     glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &params); 
     glGetProgramInfoLog(shader, 512, &size, ErrorLog); 
     fprintf(stderr, "Error compiling shader type %d: '%s'\n", ShaderType, ErrorLog); 
     exit(1); 
    } 
    return true; 
} 
+1

Bekommt [diese Routine] (https://pastebin.com/ux8ppxQX) arbeiten auf Ihrem System? – genpfault

+1

Ja, und jetzt fühle ich mich albern. Die Quelle, von der ich OpenGL gelernt habe, machte keinen großen Unterschied zwischen 'glGetShaderInfoLog' und' glGetProgramInfoLog' und daher dachte ich, dass letzteres in allen Fällen funktionieren würde. Wenn Sie Ihre Fehlerüberprüfungsfunktion sehen und zum vorherigen wechseln, funktioniert der Code einwandfrei. Danke für Ihre Hilfe. Wenn du das in eine Antwort werfen willst, akzeptiere ich – irishMTS

+0

Doh! Fühle mich nicht zu schlecht, ich hätte das auch nur aus dem Lesen deines Codes sehen sollen :) – genpfault

Antwort

3
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &params); 
glGetProgramInfoLog(shader, 512, &size, ErrorLog); 
    ^^^^^^^ should be Shader 

Sie kompilieren & einen Shader überprüft, so dass Sie glGetShaderInfoLog() verwenden sollten.

glGetProgramInfoLog() ist für den Link Protokoll des gesamten Shader-Programm-Objekt greifen Sie von glCreateProgram()

Verwandte Themen