【问题标题】:How could OpenGL buffers' state persist between program runs?OpenGL 缓冲区的状态如何在程序运行之间持续存在?
【发布时间】:2010-11-06 08:16:41
【问题描述】:

我正在编写一个 OpenGL 程序,该程序绘制到辅助缓冲区中,然后辅助缓冲区的内容在被 GL_RETURN 编辑到后台缓冲区之前累积到累积缓冲区(本质上是合成到屏幕上)。简而言之,我正在做一种运动模糊。然而奇怪的是,当我重新编译并重新运行我的程序时,我看到了之前程序运行的辅助/累积缓冲区的内容。这根本不符合逻辑。我是不是误会了什么,当程序重新启动时,OpenGL的状态不应该完全重置吗?

我正在 GeForce Go 6150 上的 Gentoo Linux nVidia Drivers 195.36.31 中编写 SDL/OpenGL 程序。

【问题讨论】:

    标签: c++ opengl sdl framebuffer


    【解决方案1】:

    不 - 您的 GPU 没有理由清除其内存。在使用纹理之前,您有责任清除(或初始化)纹理。

    【讨论】:

    • 谢谢,至少现在我知道这不是一个意外的行为,虽然它只是令人毛骨悚然......
    • 我同意。想要补充:在某些情况下,出于“安全”考虑(邪恶的程序可能想知道其他人在绘制什么),视频驱动程序被要求对分配的内存进行零初始化。这很荒谬(我想说这应该是那个想要隐藏其中间输出的程序的责任),但事情就是这样。
    • 我在 DirectX9 时代做了很多 Direct3D。当我开始时,帧缓冲区、表面等总是未初始化,代码很容易暴露前一次运行的内容。在某些时候,Microsoft 或驱动程序提供商必须决定“修复”此问题,而您将获得空白缓冲区。我相信这是以安全的名义完成的。我会说安全问题是有效的;我们不会容忍一个系统将包含其他用户未清除碎片的 RAM 交给用户进程,并且不应区别对待帧缓冲区 RAM。
    • 请注意,它也很便宜。 GPU 内存很快,您不会每秒准确地分配数千次新的帧缓冲区。
    【解决方案2】:

    实际上,OpenGL 状态 已初始化为明确定义的值。

    但是,GL 状态由所有二进制开关 (glEnable)、混合、深度测试模式等设置组成。每一个都有其默认设置,在OpenGL specs 中有描述,您可以确保它们将在上下文创建时强制执行。

    关键是,帧缓冲区(或纹理数据或顶点缓冲区或任何东西)不是所谓的“GL 状态”的一部分。 GL 状态在您的驱动程序中“存在”。存储在 GPU 内存中的内容完全不同,在您要求驱动程序(通过 GL 调用)对其进行初始化之前,它是未初始化的。因此,如果您在启动时不清除或初始化它,则完全有可能将之前运行的剩余部分保存在纹理内存中,甚至保存在帧缓冲区本身中。

    【讨论】:

      猜你喜欢
      • 2011-02-10
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-05
      • 2014-11-21
      • 1970-01-01
      • 2020-03-21
      相关资源
      最近更新 更多