2012-01-01 164 views
3

GLSL有許多預定義的全局變量,例如gl_lightsource。它們是全球性的,因爲任何着色器都可以訪問它們。GLSL全局變量

如何在GLSL中定義自定義全局變量?

回答

4

全局變量在GLSL中不存在。 gl_*變量是硬編碼變量(將它們視爲自動添加編譯時間)從着色器訪問流水線的非可編程元素。在覈心OpenGL 3.0中,大部分已被刪除,包括gl_LightSource。現在,用戶需要處理他自己的矩陣和燈光,並將它們作爲制服發送給着色器。如果你想查看所有剩下的列表,你應該看看GLSL Reference Pages

你想要的是制服。如果要在着色器之間同步校服,請存儲制服的位置,並遍歷所有程序以將制服上載到每個着色器。

1

OpenGL中的全局着色器變量稱爲「制服」。它們是隻讀的,可以用glUniformX調用綁定。粗略地說,它看起來像這樣(這更是一個僞代碼的):

// 1. activate the program 
glUseProgram(program) 

// 2. get uniform location 
foo = glGetUniformLocation(program, "foo") 

// 3. bind the value, e.g. a single float 
glUniform1f(foo, 42.0) 

着色器中,您需要uniform存儲預選賽中,例如出線變量

uniform float foo; 
+0

但是那麼如果program2想訪問foo呢? – 2012-01-02 03:01:04

+0

@KevinKostlan:沒有什麼能阻止你在多個程序中使用同一套制服。只要按照上述過程爲每一個。 – 2012-01-02 03:03:09

+0

我希望有一個相機矩陣,我可以做一次glUniformX,然後每個着色器都會有它(節省時間)。我想這不存在。 – 2012-01-02 18:53:26