wglMakeCurrent纹理消失

时间:2019-02-04 19:49:55

标签: c windows opengl

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

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

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

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

enter image description here

您所看到的是同一场景渲染了3次,略有不同的背景透明颜色表明至少我正在做部分正确的操作(gl透明颜色显示正确,它甚至可以与3种不同尺寸的3台显示器一起使用) 。我试图用glGetError()拦截所有gl调用,而没有收到任何错误。我错过了特定步骤吗,还是笔记本电脑有问题?

如果有帮助,则使用现有框架来创建3个窗口,因此在创建时,每个窗口都被赋予了自己的hrc,但是我只将一个hrc用于其他2个窗口。 (因此,创建了3个hrc,并使用了1个)

1 个答案:

答案 0 :(得分:0)

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

但是,假设您的问题与诸如UVS错误,着色器问题,纹理创建等任何这些问题都不相关,则该问题可能与您正在管理多个上下文这一事实有关。

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

  

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

     

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

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

此外:

  

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

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

  

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

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