2011-12-09 33 views
0

此代碼對於3.30 OpenGL和GLSL版本有什麼問題?GLSL多於一個字符指針(glShaderSource)時編譯錯誤

const char *vertSrcs[2] = { "#define A_MACRO\n", vShaderSrc }; 
    const char *fragSrcs[2] = { "#define A_MACRO\n", fShaderSrc }; 
    glShaderSource(vId, 2, vertSrcs, NULL); 
    glShaderSource(fId, 2, fragSrcs, NULL); 

我收集與GL_COMPILE_STATUS着色器狀態下,它的編譯後,出現此錯誤:

Vertex shader failed to compile with the following errors: 

該宏的目的是改變顏色我從頂點傳遞給類型限定符片段,也許有另一種方法來使用制服和佈局來做到這一點,但問題是爲什麼着色器會失敗?我想知道是否有另一個必須指定2個字符指針的OpenGL命令。 順便說一句,這個工程:

... 
glShaderSource(vId, 1, &vertSrcs[1], NULL); 
... 

編輯:因爲我不能回答我自己的問題,找到解決方案

很奇怪的問題,該字符串裝載機恰好是問題。不使用ifstream連同std :: ios :: in | std :: ios :: binary標誌,該字符串被加載了一些垃圾信息,甚至以空終止,因此連接字符串將產生錯誤。 出於某種原因,GL編譯器沒有與單串版本之前抱怨,除了要求

inStream.flags(std::ios::in | std::ios::binary) 

是不夠的,它需要被指定時開放,沒有發現這方面的任何文檔。

+1

那麼......下列哪些錯誤? – genpfault

+0

不幸的是** glGetShaderInfoLog(...); **不會記錄任何東西,我會讓你知道,如果我找到原因,至少運行使用gDEBugger不會顯示任何相關的錯誤並運行良好... – notNullGothik

+1

你可以回答自己並接受它。並且爲了避免像你所擁有的那樣的問題,因爲這是glShaderSource的最後一個參數,它告訴OpenGL每個源字符串的長度,從而避免它讀入垃圾。 – datenwolf

回答

0

GLSL着色器的第一個非空行必須是#version預處理器語句。其他任何事情都是錯誤的。

+0

謝謝,我也試過,從我的着色器中刪除第一行**#版本330 **,然後在這裏添加:'const char * vertSrcs [2] = {「#version 330 \ n #define A_MACRO \ n」,vShaderSrc }; ...'也不起作用。 – notNullGothik