OpenGL统一变量持久性



让我们假设我在GLSL着色器中有一个统一变量,该值在程序启动时设置。该值在程序执行过程中永远不会更改。

我想做的是从我的主C++程序中设置这个统一变量。

我的问题是,每次调用glUseProgram时,这个统一变量似乎都会被清除。我必须再次调用glUniformXX()API

有没有办法告诉OpenGL不要清除glUseProgram之间的统一变量?

统一状态将保留到下一个链接操作。实际上,glUseProgram不会重置统一状态。

您可以签入如果未绑定,统一值是否保留在GLSL着色器中?

您可能需要将逻辑&这种情况下的数据存储。在这种情况下,您可能希望将由C++应用程序初始化的GL数据传递给OpenGL&GLSL通过其API调用与您的逻辑调用分离。然后,拥有一个数据库类型的结构或类来跟踪程序、着色器、统一体和变量的所有实例变得非常方便。

你的主引擎类或结构将负责设置你的窗口,你的基本I/O,设置OpenGL上下文,创建你的程序&着色器以及将它们传递给渲染器或视频卡的调用。您的应用程序逻辑也应该与此分离。这种将数据结构分离的方法的另一个好特性是将它们作为引擎的一部分,该引擎通过初始化过程依赖于从特定应用程序接收的输入数据。

使用管理器类型的类来维护和跟踪每个程序的所有实例,shader&它的数据可以保留所有制服的低成本单个实例,因为容器中的const类型和变量类型在其生命周期内保留,然后在使用后丢弃,需要时会创建新的。当您启用&禁用分配&销毁它们的内部数据集,您仍然可以访问现有数据,只要您以缓存友好的方式创建这种类型的管理类,就可以轻松地检索和重新初始化这些数据。这还依赖于知道哪种类型的数据作为堆栈变量,或者哪种类型作为动态内存。模板的使用与智能指针(例如std::shared_ptr<T>&CCD_ 2。我在这里提到智能指针的原因是,它确实使清理变得更容易,有助于管理所有权,并且您可以轻松地存储、创建、调度和移除制服&单个容器中的变量类型。然而,这种类型的结构相当复杂,超出了试图完全回答这个问题的范围,因为游戏或3D图形引擎的集成部分太多,无法在这里显示。

最新更新