1

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

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

我们用于wglSwapIntervalEXT在我们的应用程序中启用垂直同步。考虑到它可能会发生冲突,我删除了它的代码;不用找了。

这绝对是一个驱动程序错误,还是我们必须做任何不同的事情来处理三重缓冲?

4

1 回答 1

4

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

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

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

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

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

恐怕我的答案倾向于“驱动程序错误”,但第 4 点显示了一种解决方法——而不是在 OnCreate 中创建 GL 窗口,而是尝试在 OnInitialUpdate 中一次性完成——这到目前为止是有效的在为我测试!

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

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

于 2013-03-26T04:53:17.057 回答