2009-12-17 28 views
2

我試圖運行一個GLSL example,但我不能。編譯和運行GLSL程序需要什麼?

錯誤位於程序退出的行glGetShaderiv(vShader, GL_COMPILE_STATUS, &status);vShader是文件vPhong.glsl

返回的錯誤是:

0(18) : error C0000: syntax error, unexpected $undefined at token "<undefined>" 
0(18) : error C0501: type name expected at token "<undefined>" 

我已經 '安裝' 和參考GLEW和過剩和他們的LIB-文件。我有glewInit'編輯我的程序。

程序能夠找到.glsl文件。

奇怪的是我能運行一個precompiled GLSL-demo,並且在我的電腦上編譯並運行the project。非工作計劃中的「初始化」與此相同。

我試圖將有缺陷的源複製到成功的項目中,以查看項目設置中是否存在導致錯誤的內容,但不幸的是,情況並非如此。 所以這個錯誤似乎是在C++代碼中,而不是項目。


進展情況:

在我的Windows 7機器通過Visual Studio運行時,我得到了 「訪問衝突」。如果我「獨自」運行該程序,該程序停止工作。在Windows XP計算機上,我得到了未捕獲的異常。

當我編譯程序時,我沒有收到任何錯誤或警告(除了警告fopen是不安全的)。

Visual Studio突出顯示行vShader = glCreateShader(GL_VERTEX_SHADER);作爲錯誤的來源。

添加glewInit();修復了上述錯誤。

+0

你給的鏈接是壞的? – ufukgun 2009-12-17 15:53:57

+0

有關更多信息,在該點程序停止工作(我假設通過視覺工作室運行它也會告訴你異常的起源)也將有所幫助(當然鏈接是固定的...) – Grizzly 2009-12-17 16:09:39

+0

Link isn破壞了。 :)我已經提供了有關錯誤發生位置的更多信息。 – jumoel 2009-12-17 16:27:25

回答

2

program有兩個錯誤:

第一:

glLinkProgram(program); 
glGetShaderiv(program, GL_LINK_STATUS, &status); 

最後一行應該是glGetProgramiv(program, GL_LINK_STATUS, &status);

此外,在着色器文件中讀取的fopen應與rb一起用作參數,而不是僅用於r

glGetShaderiv代替glGetProgramiv並加入glewInit()修復了我最初的錯誤之一。

將參數更改爲fopen可修復着色器錯誤。

0

我不知道你是如何編譯該代碼的。它使用的是不直接在Windows SDK中提供的GL API。所有着色器API都在該類別中。

要在Windows上訪問它們,通常需要使用wgl提供的擴展機制,或者使用擴展包裝器。

[編輯添加]

所以......與GLEW INIT閃開!着色器編譯提供未能建立時,生成日誌(從this tutorial拍攝):

GLint blen = 0; 
GLsizei slen = 0; 

glGetShaderiv(ShaderObject, GL_INFO_LOG_LENGTH , &blen);  

if (blen > 1) 
{ 
GLchar* compiler_log = (GLchar*)malloc(blen); 

glGetInfoLogARB(ShaderObject, blen, &slen, compiler_log); 
cout << "compiler_log:\n", compiler_log); 
free (compiler_log); 
} 
+0

正如我寫的:我正在使用GLEW。鏈接的源文件和我使用的唯一區別是我包含了而不是。 – jumoel 2009-12-17 17:44:50

+0

對不起。那麼,glew可能隱藏了這個問題。你初步接近了嗎? glCreateShader的價值是什麼? – Bahbar 2009-12-17 17:53:37

+0

我忘了啓動glew -_-。現在頂點着色器顯然不能編譯。 – jumoel 2009-12-17 18:25:16

0

該錯誤消息通常意味着在你的shader程序文件本身的某種錯誤。根據我的經驗,它在文件的開頭或結尾處就像是一個意想不到的字符。嘗試將該URL中的文本複製並粘貼到記事本或gedit中,然後保存該文件。

1

這些錯誤來自GLSL編譯器,而不是C++編譯器。在某些着色器的第18行,你有一些讓GLSL編譯器感到困惑的東西;可能是隨機垃圾或不可打印的字符。一種簡單的方法是爲你的着色器源指定太長的長度(或者根本沒有長度),並且在字符串末尾沒有NUL終止符