Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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
如何跨函数调用跟踪OpenGL状态?_Opengl_Oop - Fatal编程技术网

如何跨函数调用跟踪OpenGL状态?

如何跨函数调用跟踪OpenGL状态?,opengl,oop,Opengl,Oop,由于OpenGL是一个状态机,我经常在程序中使用glEnable()和glDisable()。我只在开始时进行了一些选择调用(如glClearColor),但大多数其他调用我都会打开和关闭(如照明,取决于我是渲染模型还是3d文本或gui) 你如何记录事物处于什么状态?您是否经常在每个功能的顶部设置/重置这些内容?这不是很多不必要的开销吗 例如,当我编写一个新函数时,有时我知道调用该函数时将处于什么状态,并且我在函数顶部省略了glEnable或glDisable或其他相关的状态切换调用。其他时候,

由于OpenGL是一个状态机,我经常在程序中使用glEnable()和glDisable()。我只在开始时进行了一些选择调用(如glClearColor),但大多数其他调用我都会打开和关闭(如照明,取决于我是渲染模型还是3d文本或gui)

你如何记录事物处于什么状态?您是否经常在每个功能的顶部设置/重置这些内容?这不是很多不必要的开销吗

例如,当我编写一个新函数时,有时我知道调用该函数时将处于什么状态,并且我在函数顶部省略了glEnable或glDisable或其他相关的状态切换调用。其他时候,我只是提前编写函数,然后添加这些东西。因此,我的函数最终变得非常混乱,其中一些修改OpenGL状态,另一些只是做出假设(这些假设后来被打破,然后我必须返回并找出为什么某个东西变黄,或者为什么另一个东西颠倒了,等等)

如何在面向对象环境中跨函数跟踪OpenGL


与此问题相关的还有,如何知道何时使用push和pop,以及何时只设置值

例如,假设你有一个程序,画一些3D的东西,然后再画一些2D的东西。显然,投影矩阵在每种情况下都是不同的。你也是:

  • 设置三维投影矩阵,绘制三维,设置二维投影矩阵,绘制二维,循环
  • 在程序中设置三维投影矩阵;然后绘制3d、推送矩阵、绘制2d、弹出矩阵、循环

  • 为什么呢?

    好问题。想想纹理是如何工作的。OpenGL有大量的纹理可供切换,在绘制每个对象后,您需要启用/禁用纹理。通常,您会尝试通过一次绘制具有相同纹理的所有对象来优化这一点,但仍然会有大量的状态切换。因为这个事实,我尽我所能一次画出所有状态相同的东西,但我不确定优化你的思维方式是否非常重要


    对于三维和二维投影模式之间的推送和弹出,推送和弹出旨在用于层次建模。如果需要二维投影位于相对于三维对象的位置,请务必按下矩阵并切换到二维投影模式,然后在完成后弹出。但是,如果您正在编写一个在屏幕上具有恒定位置的2D GUI覆盖,我看不出为什么推送和弹出很重要。

    您可能有兴趣阅读有关场景图库的更多信息。它们旨在从更高的层次管理您的图形。它们不能很好地处理所有问题,但它们擅长组织几何体以优化渲染。此外,它们还可以用于根据OpenGL状态对场景进行排序,尽管许多场景不这样做。通过按状态排序,可以按导致较少状态转换的顺序渲染几何体。下面是关于场景图库的一个很好的概述:


    我认为最简单的方法是编写自己的渲染类,包装您正在使用的所有OpenGL状态操纵函数,并对您设置的状态进行簿记。您需要考虑到更改屏幕分辨率或切换全屏模式将使当前OpenGL渲染上下文的状态和数据无效,这意味着在发生此类事件后,您必须设置所有状态,重新上载所有纹理和着色器程序等。

    是的,我非常熟悉它们。我使用的是Java,所以有Xith3D和jMonkeyEngine。问题是我沉迷于这些引擎,实际上没有做任何值得做的事情。现在我刚刚编写了纯OpenGL,实际上我正在完成一些工作。不过还是谢谢你。看来你有点发明轮子了。您完成的工作中有多少已经由场景图库管理?.ms3d文件加载器和边界框计算。大概就是这样。我不能使用场景图库,至少很容易,是我的特殊高度图(带有计划的动态加载)和我的自定义GUI功能。所以,是的,这是一个折衷方案,但对我来说,写场景图库可以做的事情,然后做其他它不能做的事情,比使用场景图库并尝试找出解决方法和技巧,以便能够在屏幕上绘制2d形状或其他东西更容易。我不确定你的第一段是否真的解决了这个问题,虽然我确信这主要是因为我没有很好地解释我自己。当我对自己想问的问题有了一个更清晰的概念后,我需要回到这个问题上来。谢谢你对push/pop的理解,我喜欢这个解释。