2017-10-12 111 views
-1

假設我在GLSL着色器中有一個統一變量,該值在程序啓動時設置。該值在程序執行期間不會改變。OpenGL統一變量持久性

我想要做的是從我的主C++程序中設置這個統一變量。

我的問題是,統一變量似乎每次我打電話glUseProgram清除。我必須再次調用glUniformXX()API

有沒有辦法告訴OpenGL不要清除glUseProgram之間的統一變量?

+1

OpenGL不會自行清除統一值。你必須顯示你的實際代碼,因爲它完全不清楚究竟發生了什麼。 – derhass

回答

-1

您可能要分開邏輯&存儲數據的這種情況。在這種情況下,您可能希望將由C++應用程序初始化的GL數據通過與您的邏輯調用分開的API調用傳遞給OpenGL & GLSL。然後讓數據庫類型結構或類跟蹤程序的所有實例,着色器,制服和變量變得非常方便。

您的主引擎類或結構將負責設置您的窗口,基本I/O,設置OpenGL上下文,創建程序着色器以及將它們傳遞給渲染器或視頻卡的調用。您的應用程序邏輯也應與此分開。這種將數據結構分開的方法的另一個好處是將它們作爲引擎的一部分,它依賴於通過初始化過程從特定應用程序接收到的輸入數據。

使用管理器類型類來維護和跟蹤每個程序的所有實例,着色器&其數據可以保留所有制服的低成本單個實例,因爲容器和變量類型中的常量類型保留爲他們的一生,然後在使用後丟棄,在需要時將創建新的。通過這種方式,當您啓用&禁用分配&銷燬其內部數據集的程序時,仍然可以訪問您可以輕鬆檢索並重新初始化的現有數據,只要您以緩存友好的方式進行此類管理類即可。這也依賴於知道哪些類型的數據具有堆棧變量或哪些類型具有動態內存。模板的使用可以非常方便地與智能指針一起使用,例如std::shared_ptr<T> & std::unique_ptr<T>。我在這裏提到智能指針的原因是它的清理更容易,它有助於管理所有權,並且您可以輕鬆地存儲,創建,調度和刪除單個容器中的統一變量類型。然而,這種類型的構造相當複雜,超出了試圖完全回答這個問題的範圍,因爲在這裏顯示的遊戲或3D圖形引擎的集成部分太多。