Windows DCs和GLRC对应什么?

Windows DCs和GLRC对应什么?,windows,winapi,opengl,gdi,wgl,Windows,Winapi,Opengl,Gdi,Wgl,在Windows中,DC对应于什么?我知道我可以从HWND或HMONITOR获得HDC。这是否意味着窗口的DC是其监视器DC的别名或代理?Windows允许您说窗口类应该有自己的DC,因此看起来它们不是同一个DC,尽管Windows API似乎也支持DC之间有父子关系。我会发现监视器的DC是父DC之一吗 如果一个窗口跨越多个监视器,会发生什么情况?Windows API似乎只支持从窗口获取单个HDC和从HDC获取单个HGLRC。我已经读到OpenGL不支持跨多个监视器的全屏窗口,因此必须有多个窗

在Windows中,DC对应于什么?我知道我可以从HWND或HMONITOR获得HDC。这是否意味着窗口的DC是其监视器DC的别名或代理?Windows允许您说窗口类应该有自己的DC,因此看起来它们不是同一个DC,尽管Windows API似乎也支持DC之间有父子关系。我会发现监视器的DC是父DC之一吗

如果一个窗口跨越多个监视器,会发生什么情况?Windows API似乎只支持从窗口获取单个HDC和从HDC获取单个HGLRC。我已经读到OpenGL不支持跨多个监视器的全屏窗口,因此必须有多个窗口才能实现这一点

SLI/Crossfire系统是否为单个GLRC

在我看来,GLRC与图形系统最为相似。GLRC代表单个图形系统。DCs代表输出。GLRC可以绘制到与图形系统连接的输出相关联的任何DC以及这些DC的任何子DC。您还可以有多个监视器和多个图形卡,每个监视器和图形卡都成对在一起,因此每个GLRC与每个DC成对


更正或确认?

Windows中的设备上下文是一个可以(理论上)绘制到的表面,并且很可能对显示器可见。Windows具有设备上下文,桌面窗口和监视器也是如此。单个窗口可以共享设备上下文;这可能发生在表示简单控件的子窗口中,等等

设备上下文没有您所指的父/子关系。整个过程是关于窗口设备上下文的剪切矩形

一个窗口有一个单一的设备上下文,周期(如果该窗口不使用
CS\u OWNDC
,那么它会稍微复杂一点,但是在处理OpenGL时,您应该始终使用它),无论该窗口位于何处。术语“设备上下文”不应与“监视器”或任何实际硬件混淆。它只是一个你也许可以画的表面

对于OpenGL,设备上下文与渲染上下文的关联相对松散。在RC中使用任何设备上下文都是合法的,只要该RC是使用新DC具有的相同像素格式创建的。所以你可以在DC1上设置一个像素格式,用它做一个RC,然后在DC2上设置相同的像素格式,你可以用wglMakeCurrent和DC1或DC2以及那个RC

多监视器如何与OpenGL配合使用完全取决于GPU的设置。允许OpenGL在Windows上工作的ICD机制只允许安装一个驱动程序。因此,如果您的系统中有两个卡,每个卡插入单独的监视器,并且有两个不同的驱动程序,OpenGL将只能识别其中一个。尝试绘制部分位于另一个GPU屏幕上的DC将产生不可预测的结果

现在,如果你有一张卡片可以传送多个监视器,OpenGL就不在乎了。问题在于独立、可见的图形处理器的数量


这就是说,SLI/Crossfire的全部目的是假装两个GPU实际上只是一个。因此,您只有一个驱动程序,操作系统只能看到一个GPU,并且这些卡中只有一个输出到监视器。因此,OpenGL的工作原理与为多个监视器提供一张卡的工作原理完全相同。

Windows中的设备上下文是一个可以(理论上)绘制到的表面,并且很可能对显示器可见。Windows具有设备上下文,桌面窗口和监视器也是如此。单个窗口可以共享设备上下文;这可能发生在表示简单控件的子窗口中,等等

设备上下文没有您所指的父/子关系。整个过程是关于窗口设备上下文的剪切矩形

一个窗口有一个单一的设备上下文,周期(如果该窗口不使用
CS\u OWNDC
,那么它会稍微复杂一点,但是在处理OpenGL时,您应该始终使用它),无论该窗口位于何处。术语“设备上下文”不应与“监视器”或任何实际硬件混淆。它只是一个你也许可以画的表面

对于OpenGL,设备上下文与渲染上下文的关联相对松散。在RC中使用任何设备上下文都是合法的,只要该RC是使用新DC具有的相同像素格式创建的。所以你可以在DC1上设置一个像素格式,用它做一个RC,然后在DC2上设置相同的像素格式,你可以用wglMakeCurrent和DC1或DC2以及那个RC

多监视器如何与OpenGL配合使用完全取决于GPU的设置。允许OpenGL在Windows上工作的ICD机制只允许安装一个驱动程序。因此,如果您的系统中有两个卡,每个卡插入单独的监视器,并且有两个不同的驱动程序,OpenGL将只能识别其中一个。尝试绘制部分位于另一个GPU屏幕上的DC将产生不可预测的结果

现在,如果你有一张卡片可以传送多个监视器,OpenGL就不在乎了。问题在于独立、可见的图形处理器的数量


这就是说,SLI/Crossfire的全部目的是假装两个GPU实际上只是一个。因此,您只有一个驱动程序,操作系统只能看到一个GPU,并且这些卡中只有一个输出到监视器。因此,OpenGL的工作原理与为多个监视器提供一张卡的工作原理完全相同。

这非常有用。我很可能会将此标记为我接受的答案。谢谢你,伙计。这篇文章似乎也证实了你提到的-()。真正遗憾的是OpenGL缺乏这种支持,即使是作为API中特定于操作系统的部分。我的OpenGL API抽象层只需返回对单个“设备”的支持即可。@SionSheevok:这不是缺少OpenGL方面的功能,而是操作系统的驱动程序模型。类似的限制也存在