The OpenGL docs for glUseProgram
聲稱使用參數零調用它將導致着色器執行的結果爲undefined
。glUseProgram(0)做什麼?
但是,經過一番搜索,我已經看到一些人使用glUseProgram
到卸載當前着色器程序的例子。
這種行爲可靠嗎?如果不是,那麼glUseProgram(0)
究竟做了什麼?
The OpenGL docs for glUseProgram
聲稱使用參數零調用它將導致着色器執行的結果爲undefined
。glUseProgram(0)做什麼?
但是,經過一番搜索,我已經看到一些人使用glUseProgram
到卸載當前着色器程序的例子。
這種行爲可靠嗎?如果不是,那麼glUseProgram(0)
究竟做了什麼?
glUseProgram
表示給定的程序對象是將用於使用程序(glUniform
,渲染命令等)的當前程序。 0很像用於OpenGL對象的NULL
。它代表not an object
(對於大多數物體)。因此,glUseProgram
意味着否程序是最新的,因此沒有程序將用於使用程序的東西。
如果您嘗試在沒有程序爲最新時調用glUniform
函數,它們將失敗並顯示錯誤。如果您嘗試渲染時沒有程序是最新的,則會發生以下兩件事之一。
GL_INVALID_OPERATION
錯誤,因爲核心的OpenGL 必須與程序渲染。它告訴OpenGL使用固定功能流水線。
請注意,在覈心配置文件中沒有固定功能流水線,所以您只會得到OpenGL錯誤('GL_INVALID_OPERATION') –
-----注意----- – Aaron
或者在某些機器上,段錯誤。 – SystemParadox
與這裏和其他地方的很多答案相反,glUseProgram(0)是不安全的。您可以使用它將渲染狀態設置爲無效的程序對象,但是如果渲染髮生時仍然與此綁定,則行爲是undefined。
這可能有助於避免錯誤地使用錯誤的程序,但不應該用它來表示「使用固定功能模式」。在大多數情況下,這是發生了什麼,但它不是由規範定義,不應該依賴。
從doc:
「如果程序是零,那麼當前的渲染狀態指的是 無效程序對象和着色器執行的結果是
undefined
」
因此結果完全針對操作系統,驅動程序和圖形卡。在很多情況下,它似乎恢復到固定功能模式。但是,它可以輕鬆保持最後一個着色器,渲染垃圾或導致段錯誤(我已經看到過這種情況)。
glUseProgram(0)是完全安全的。如該頁所述,調用glUseProgram(0)並不是一個錯誤;只能渲染任何沒有程序綁定的東西。這僅適用於核心配置文件。 – rdb
這個答案是錯誤的。 rdp是對的。調用「glUseProgram(0)」不是着色器執行。如果在調用「glUseProgram(0)」之後執行渲染,那麼這是着色器執行! – Tara
@Dudeson,你是對的。 glUseProgram()不會導致着色器執行,但正如規範所說,它會更改渲染狀態,以便任何着色器執行的結果(當您稍後執行某項操作時)未定義 – SystemParadox
一旦您使用glUseProgram(myShader)
所有後續渲染將使用着色器ID myShader
完成。
如果您每次在modern openGL 3.1+
中進行重大更改時都會調用此函數,則幾乎沒有任何用處glUseProgram(0)
。
但是,如果你打算到一些固定的功能呈現在那裏整合,像glVertex3f(..)
,然後glUseProgram(0)
將確保上次使用的着色器是不活躍了,它會使用固定功能管線一樣glColor3f(...)
換句話說,我不應該調用'glUseProgram(0)'? – user11171
@ user11171:不可以。你應該在你沒有綁定程序時調用它。通過這樣做,您可以防止意外地使用非預期的程序進行渲染(例如,您忘記了用您想要的實際程序調用'glUseProgram')。當你完成渲染時,你通常會調用它。 –