OpenGL统一变量持久

时间:2017-10-12 19:17:50

标签: c++ opengl glsl

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

您可以登入Do uniform values remain in GLSL shader if unbound?

答案 1 :(得分:-1)

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

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

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