2012-11-24 156 views

回答

20

glUseProgram表示給定的程序對象是將用於使用程序(glUniform,渲染命令等)的當前程序。 0很像用於OpenGL對象的NULL。它代表not an object(對於大多數物體)。因此,glUseProgram意味着程序是最新的,因此沒有程序將用於使用程序的東西。

如果您嘗試在沒有程序爲最新時調用glUniform函數,它們將失敗並顯示錯誤。如果您嘗試渲染時沒有程序是最新的,則會發生以下兩件事之一。

  • 的OpenGL 3.1及以上版本,核心配置,你會得到一個GL_INVALID_OPERATION錯誤,因爲核心的OpenGL 必須與程序渲染。
  • 兼容性配置文件或3.0或更低版本,您將獲得固定功能渲染。
+0

換句話說,我不應該調用'glUseProgram(0)'? – user11171

+6

@ user11171:不可以。你應該在你沒有綁定程序時調用它。通過這樣做,您可以防止意外地使用非預期的程序進行渲染(例如,您忘記了用您想要的實際程序調用'glUseProgram')。當你完成渲染時,你通常會調用它。 –

2

它告訴OpenGL使用固定功能流水線。

+1

請注意,在覈心配置文件中沒有固定功能流水線,所以您只會得到OpenGL錯誤('GL_INVALID_OPERATION') –

+0

-----注意----- – Aaron

+0

或者在某些機器上,段錯誤。 – SystemParadox

3

與這裏和其他地方的很多答案相反,glUseProgram(0)是不安全的。您可以使用它將渲染狀態設置爲無效的程序對象,但是如果渲染髮生時仍然與此綁定,則行爲是undefined

這可能有助於避免錯誤地使用錯誤的程序,但不應該用它來表示「使用固定功能模式」。在大多數情況下,這是發生了什麼,但它不是由規範定義,不應該依賴。

doc

「如果程序是零,那麼當前的渲染狀態指的是 無效程序對象和着色器執行的結果是 undefined

因此結果完全針對操作系統,驅動程序和圖形卡。在很多情況下,它似乎恢復到固定功能模式。但是,它可以輕鬆保持最後一個着色器,渲染垃圾或導致段錯誤(我已經看到過這種情況)。

+2

glUseProgram(0)是完全安全的。如該頁所述,調用glUseProgram(0)並不是一個錯誤;只能渲染任何沒有程序綁定的東西。這僅適用於核心配置文件。 – rdb

+0

這個答案是錯誤的。 rdp是對的。調用「glUseProgram(0)」不是着色器執行。如果在調用「glUseProgram(0)」之後執行渲染,那麼這是着色器執行! – Tara

+0

@Dudeson,你是對的。 glUseProgram()不會導致着色器執行,但正如規範所說,它會更改渲染狀態,以便任何着色器執行的結果(當您稍後執行某項操作時)未定義 – SystemParadox

0

一旦您使用glUseProgram(myShader)所有後續渲染將使用着色器ID myShader完成。

如果您每次在modern openGL 3.1+中進行重大更改時都會調用此函數,則幾乎沒有任何用處glUseProgram(0)

但是,如果你打算到一些固定的功能呈現在那裏整合,像glVertex3f(..),然後glUseProgram(0)將確保上次使用的着色器是不活躍了,它會使用固定功能管線一樣glColor3f(...)