2012-09-05 89 views
3

我正在嘗試構建一個簡單的由單個片段着色器組成的OpenGL 3.2程序,但我似乎無法真正編譯着色器。我相當肯定我的着色語法是正確的,但即使不是這樣,我也無法使用glGetShaderInfoLog來檢索錯誤消息。無法從glGetShaderInfoLog檢索錯誤消息

我開發了一個小程序,顯示這個動作:

GLuint shader = glCreateShader(GL_FRAGMENT_SHADER); 

const char *shaderData = 
      "#version 120\n" 
      "void main()\n" 
      "{\n" 
      " gl_FragColor = gl_Color;\n" 
      "}\n"; 
glShaderSource(shader, 1, &shaderData, NULL); 

GLint status; 
glGetShaderiv(shader, GL_COMPILE_STATUS, &status); 

if (status == GL_FALSE) 
{ 
    GLint infoLogLength; 
    glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength); 

    GLchar* strInfoLog = new GLchar[infoLogLength + 1]; 
    glGetShaderInfoLog(shader, infoLogLength, NULL, strInfoLog); 

    fprintf(stderr, "Compilation error in shader %s: %s\n", this->name, strInfoLog); 
    delete[] strInfoLog; 
} 

這產生了消息:

編譯錯誤着色器片段着色器:

這個問題似乎因爲getShaderiv檢索GL_INFO_LOG_LENGTH值的調用每次都返回0,所以我分配一個空的條帶G。我試圖將此值硬編碼爲100,但我仍然從getShaderInfoLog收到任何內容。

我在這裏關心的不是修復着色器(如果它錯了,我可以自己做),而是獲取調試信息。我知道這可以完成,因爲我已經使用Shader Maker來簡單地開發着色器,並且能夠獲得非常詳細的調試消息。例如:

ERROR: 0:11: 'undefined_variable' : syntax error syntax error

除非着色標記都有自己的驗證工具在內部,我敢肯定,它必須使用我試圖用同樣的方法。我在互聯網上看到了幾個例子,其中人們以相同的方式檢索着色器的錯誤消息,所以我確信我正確地做到了。

現在,我得到一個編譯時警告,這可能解釋了這個問題:

#warning gl.h and gl3.h are both included. Compiler will not invoke errors if using removed OpenGL functionality.

做全文搜索後,我找不到任何地方,我打電話#include <OpenGL/gl.h>,所以我猜測這個頭文件正在被NSOpenGL*類中的一個包含。我相當確定我在這個短程序中沒有使用任何刪除的功能,而且這個問題在Google上只有5次點擊,不過我認爲我最好還是提一提。

+4

我在代碼中看不到'glCompileShader'。 – JWWalker

+0

天啊!我不敢相信我錯過了!我現在正在按照預期收到我的錯誤消息。我建議你把這個問題寫成這個問題的答案,這樣我可以將其標記爲已解決。這是當你編碼到凌晨時發生的情況。 –

回答

7

正如先前的評論中指出的,glCompileShader呼叫缺失。

相關問題