OpenGL 缓冲区的状态如何在程序运行之间持续存在?

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

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

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

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

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

【讨论】:

以上是关于OpenGL 缓冲区的状态如何在程序运行之间持续存在?的主要内容,如果未能解决你的问题,请参考以下文章

在 OpenGL 中,(如何)我可以在两个深度缓冲区之间进行深度测试?

在交错的 openGL 顶点缓冲区对象之间复制

OpenGL 四 - 002OpenGL 图形渲染之颜色混合

隐藏 GLUT 窗口

快速修改 OpenGL VAO 缓冲区

初识OpenGL (-)编程思想