2017-07-14 377 views
1

我正在編寫一個我知道編譯正確的代碼庫。目前,我在着色器中引入了有目的的拼寫錯誤來模擬錯誤。此時,代碼拒絕編譯。然後我可以叫爲什麼glGetProgramInfoLog返回一個空字符串?

glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &params); 

發現params現在是108其中以前0,所以我知道有這個着色器(我曾嘗試編譯)相關的日誌。然而,當我打電話

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

size返回0,和ErrorLog仍然是空的。

下面是在這種情況下,重要的代碼:

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

確實[這個例程]獲得完整的着色器程序對象的鏈接日誌(https://pastebin.com/ux8ppxQX)你的系統上運行? – genpfault

+1

是的,現在我感到很傻。我一直在學習OpenGL的源代碼在'glGetShaderInfoLog'和'glGetProgramInfoLog'之間沒有很大的區別,所以我認爲後者可以在任何情況下工作。在看到您的錯誤檢查功能並更改爲前者時,代碼正常工作。謝謝你的幫助。如果你想把這個問題轉換成答案,我會接受 – irishMTS

+0

Doh!不要覺得太糟糕,我應該從閱讀你的代碼中看到這一點:) – genpfault

回答

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

你正在編譯&檢查着色器,所以你應該使用glGetShaderInfoLog()

glGetProgramInfoLog()是抓住你glCreateProgram()

相關問題