Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL统一变量持久性_C++_Opengl_Glsl - Fatal编程技术网

C++ OpenGL统一变量持久性

C++ OpenGL统一变量持久性,c++,opengl,glsl,C++,Opengl,Glsl,假设在GLSL着色器中有一个统一变量,该值在程序启动时设置。该值在程序执行期间不会更改 我想从我的主要C++程序中设置这个统一变量。< /P> 我的问题是,每次调用glUseProgram时,统一变量似乎都被清除了。我必须再次调用glUniformXX()API 有没有办法告诉OpenGL不要清除glUseProgram之间的统一变量?统一状态将保留到下一个链接操作。实际上,glUseProgram不会重置统一状态 您可以签入在这种情况下,您可能需要分离数据的逻辑和存储。在这种情况下,您可能希望

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

我想从我的主要C++程序中设置这个统一变量。< /P> 我的问题是,每次调用glUseProgram时,统一变量似乎都被清除了。我必须再次调用glUniformXX()API


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

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


您可以签入

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

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


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

OpenGL本身并不清除统一的值。您必须显示实际的代码,因为不清楚到底发生了什么。