2014-10-18 45 views
2


我知道這聽起來像一個奇怪的「問題」,但堅持與我。
OpenGL GLSL代碼編譯時它不應該是

我有一個支持OpenGL 3.3的圖形卡。
但是,我正在編寫代碼以針對OpenGL 2.0,因此GLSL版本1.1。
我有以下GLSL代碼:

#version 110 

in vec4 position; // x,y,z,w (ignores w) 

uniform mat4 mvpMatrix; 

void main() { 
    gl_Position = mvpMatrix * position; 
} 

正如你所看到的,我已指定GLSL版本要的#Version 110
您也可能會注意到,我用的是「在」關鍵字的vec4的位置。
此關鍵字在指定的GLSL版本中不可用,但它在我的圖形卡(它也支持OpenGL 3.3)上編譯時沒有錯誤。
正確的關鍵字應該是'屬性'。
在只有OpenGL 2.1的計算機上測試時,着色器代碼會收到編譯錯誤。

爲什麼我的編譯器不能編譯出錯?它不應該編譯符合版本110的着色器並報告相應的錯誤嗎?
無論如何檢查這個?也許這是一個警告或什麼?我不知道。幫幫我!

此外,我使用LWJGL編程Java。如果這有幫助,但我認爲這與問題沒有任何關係。

編輯:
我添加的代碼要經常檢查信息日誌着色器編譯後,它仍然使用「在」關鍵字時,不會報告任何東西。

回答

1

不同的編譯器不同很多他們會接受什麼GLSL。即使着色器編譯成功,值得查看編譯日誌。日誌可以包含警告和錯誤。

在LWJGL it looks like查看日誌的方法是:

private static String getLogInfo(int obj) { 
    return ARBShaderObjects.glGetInfoLogARB(obj, 
     ARBShaderObjects.glGetObjectParameteriARB(obj, 
     ARBShaderObjects.GL_OBJECT_INFO_LOG_LENGTH_ARB)); 
} 

(代碼是行Box.java 129)

0

它總是一個好主意,檢查編譯信息登錄即使編譯成功。它可以包含警告和其他診斷信息。在LWJGL,您可以通過調用查看信息日誌ID爲shaderId着色器:

int logLen = GL20.glGetShaderi(shaderId, GL20.GL_INFO_LOG_LENGTH); 
GL20.glGetShaderInfoLog(shaderId, logLen); 

不幸的是這是很常見的GLSL的編譯器離開未報告的錯誤。我的猜測是,大多數測試都是在正確的着色器下進行的,錯誤處理的效果幾乎沒有得到驗證,並且優先級高。另外,一旦供應商發佈(意外)讓某些錯誤通過的版本,他們可能不想在稍後添加更嚴格的錯誤檢查。風險在於它會打破已經發布的軟件,因爲不完整的錯誤檢查才能正常工作。