【问题标题】:Enabling OpenGL triple buffering + vsync in AMD CCC breaks our app在 AMD CCC 中启用 OpenGL 三重缓冲 + vsync 会破坏我们的应用程序
【发布时间】:2013-01-29 18:04:53
【问题描述】:

我们有一个用 C++ 编写的桌面 Windows 应用程序,它使用 OpenGL 渲染视图。

在某些 AMD 卡上,如果您打开 Catalyst Control Center 并强制启用 Triple Buffering 和 V-sync,它会破坏我们的应用程序:根本没有渲染,它只是一个灰屏(在某些其他驱动程序版本上,它在创建时崩溃而是上下文)。关闭任一三重缓冲垂直同步将其恢复正常。

我们使用wglSwapIntervalEXT 在我们的应用中启用垂直同步。考虑到它可能会发生冲突,我删除了它的代码;没有变化。

这绝对是一个驱动程序错误,还是我们需要做些什么来处理三重缓冲?

【问题讨论】:

    标签: c++ windows opengl graphics driver


    【解决方案1】:

    我在自己的应用程序中也遇到了同样的问题,追查起来令人抓狂。以下是我可以根据我为复制问题而构建的最小应用程序测试设置提供的其他信息:

    1) 您设置像素格式和创建 GL RC 的所有调用都会成功。但是,GLDebugger 会显示 RC 实际上并没有获取静态缓冲区。

    2) 当你尝试使 RC 成为当前状态时,它会返回 false,并且 GetLastError() 表示存在无效句柄。

    3) 我只能在 MFC 中复制这个问题。那是你用的吗?当我使用直接的 Win32 API 构建测试平台应用程序时,它工作正常。这里必须有一个不起眼的互动..

    4) 如果我将 RC 创建延迟到 OnCreate 之后,那么一切正常。

    恐怕我的答案倾向于“驱动程序错误”,但第 4 点显示了一种解决方法——与其在 OnCreate 中创建 GL 窗口,不如尝试在 OnInitialUpdate 中一次性完成——这样far 正在为我测试!

    更新:我已经就这个问题联系了 AMD,事实证明这是 MFC 最初创建宽度/高度为零的窗口,然后调整大小的结果。如果在 PreCreate 函数中分配非零维度,一切正常。

    希望这对所有试图弄清楚这是怎么回事的人来说都是一个很好的资源!

    【讨论】:

    • 感谢您的解决方法建议!我会试一试,看看它是否能为我们的用户解决任何问题。 (您对我们使用 MFC 的看法是对的。)
    • 还有更好的消息:我之前就这个问题联系过 AMD,他们回复了我。事实证明,打开三重缓冲+vsynch,您的窗口在创建时必须具有非零大小。因此,在您的 PreCreateWindow 函数中,将 cx 和 cy 设置为 1。更好的解决方法:)
    • 你很幸运!尽管多次尝试与 AMD 联系,但我从未收到 AMD 的任何回复。感谢您提供额外信息,将确保使用这两种解决方法!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-23
    • 1970-01-01
    • 2012-04-17
    相关资源
    最近更新 更多