gpt4 book ai didi

opengl - 如何在函数调用中跟踪 OpenGL 状态?

转载 作者:行者123 更新时间:2023-12-04 08:19:19 25 4
gpt4 key购买 nike

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

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

例如,当我编写一个新函数时,有时我知道调用该函数时事物将处于什么状态,而我在函数顶部省略了 glEnable 或 glDisable 或其他相关的状态切换调用。其他时候,我只是提前编写函数并添加这些类型的东西。所以我的函数最终变得非常困惑,其中一些修改了 OpenGL 状态,而另一些只是做出假设(后来被破坏了,然后我必须回去弄清楚为什么有些东西变黄了,或者为什么另一件事是颠倒的,等等。 )。

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

与这个问题也相关的是,如何知道何时使用 push 和 pop,以及何时只设置值。

例如,假设您有一个程序先绘制一些 3D 内容,然后再绘制一些 2D 内容。显然,每种情况下的投影矩阵都不同。你也是:

  • 设置3d投影矩阵,绘制3D,设置2d投影矩阵,绘制2d,循环
  • 在程序中设置一个 3d 投影矩阵;然后画3d,推矩阵,画2d,弹出矩阵,循环

  • 为什么?

    最佳答案

    很好的问题。想想纹理是如何工作的。 OpenGL 有大量纹理可供切换,您需要在绘制每个对象后启用/禁用纹理。您通常会尝试通过一次绘制具有相同纹理的所有对象来优化这一点,但仍然会进行大量的状态切换。由于这个事实,我尽我所能一次绘制具有相同状态的所有内容,但我不确定按照您的想法优化它是否非常重要。

    对于 3D 和 2D 投影模式之间的 push 和 poping,pushing 和 popping 旨在用于分层建模。如果您需要将 2D 投影置于相对于 3D 对象的位置,请务必插入矩阵并切换到 2D 投影模式,然后在完成后弹出。但是,如果您正在编写在屏幕上具有恒定位置的 2D GUI 覆盖层,我认为没有理由推和弹出很重要。

    关于opengl - 如何在函数调用中跟踪 OpenGL 状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1241273/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com