我正在嘗試構建一個簡單的由單個片段着色器組成的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次點擊,不過我認爲我最好還是提一提。
我在代碼中看不到'glCompileShader'。 – JWWalker
天啊!我不敢相信我錯過了!我現在正在按照預期收到我的錯誤消息。我建議你把這個問題寫成這個問題的答案,這樣我可以將其標記爲已解決。這是當你編碼到凌晨時發生的情況。 –