2017-10-12 109 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图形引擎的集成部分太多。