【问题标题】:wglMakeCurrent textures disappearwglMakeCurrent 纹理消失
【发布时间】:2019-02-04 19:49:54
【问题描述】:

您好,我正在尝试在不同的监视器上渲染 3 个全屏窗口,直到现在我已经成功查询了现有监视器 EnumDisplayMonitors 以获得创建 3 个应用 WS_POPUP 样式的窗口所需的 4 个参数。

在一帧中我执行以下操作:

for(int i=0; i<monitorsNum; i++)
{
    wglMakeCurrent(hdcs[i], sharedHrc);
    doRendering();
    SwapBuffers(hdcs[i]);
}

许多网站都提出了相同的建议,但是,当我从 1 台显示器切换到 2 台或更多显示器时,纹理消失了:

你看到的是同一个场景渲染了 3 次,稍微不同的背景清晰颜色表明至少我做的东西部分正确(gl 清晰颜色显示正确,它甚至适用于 3 台不同尺寸的显示器) .我试图用 glGetError() 拦截所有 gl 调用而没有任何错误。是否有我遗漏的特定步骤,或者可能是我的笔记本电脑的问题?

如果有帮助,这 3 个窗口是使用现有框架创建的,因此在创建时每个窗口都有自己的 hrc,但是我只为其他 2 个窗口使用一个 hrc。 (因此创建了 3 个 hrc,并使用了 1 个,如果重要的话)

【问题讨论】:

  • 当您说 1 台显示器到 2 台或更多台显示器时,您是指 Windows 吗?
  • 当您从创建一个窗口到两个或多个窗口纹理“消失”或停止在所有窗口中正确渲染时?所以在创建多个窗口之前,您可以正确渲染纹理?
  • 似乎我在上下文中创建了网格和纹理,然后由于某些奇怪的原因,网格在其他上下文中仍然可用,否则我会更早意识到问题

标签: c windows opengl


【解决方案1】:

在渲染某些几何图形时,纹理可能无法正确显示的原因有很多。

但假设您的问题与这些事情无关,例如不正确的 UVS、着色器问题、纹理创建等,那么问题可能与您现在管理多个上下文有关。

要设置多个窗口,您需要为每个窗口创建一个上下文。 wglMakeCurrent 函数允许您切换每个窗口的上下文,随您进行渲染。

https://docs.microsoft.com/en-us/windows/desktop/api/wingdi/nf-wingdi-wglmakecurrent

wglMakeCurrent 函数使指定的 OpenGL 渲染上下文成为调用线程的当前渲染上下文。线程进行的所有后续 OpenGL 调用都绘制在 hdc 标识的设备上。您还可以使用 wglMakeCurrent 更改调用线程的当前渲染上下文,使其不再是当前的。

OpenGL 上下文表示默认帧缓冲区(渲染时着色器将输出到的默认位置),但它也存储与该 OpenGL 实例关联的所有状态。

此外:

每个上下文都有自己的一组 OpenGL 对象,这些对象独立于其他上下文。

所以这意味着除非明确告知,否则每个上下文都无法访问相同的资源。

任何对象共享都必须显式进行,无论是在创建上下文时还是在新创建的上下文创建任何对象之前。但是,上下文不必共享对象;它们可以彼此完全分开。

因此,您可以在每个窗口中渲染相同纹理的一个原因是该纹理不是共享资源。 glClearColor 可以正常工作,因为它不依赖于与任何特定上下文关联的任何资源。

【讨论】:

  • 是的,这就是理论,无论如何我解决了,基本上我是在绑定最后一个上下文时创建对象,所以当我开始将第一个绑定到 3 个窗口时它没有纹理(特别是网格缓冲区仍然可用)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-02
相关资源
最近更新 更多