【问题标题】:How do OpenGL contexts and device contexts work?OpenGL 上下文和设备上下文如何工作?
【发布时间】:2009-05-18 15:59:31
【问题描述】:

我是 U/I 编程的新手,我正在尝试开始使用 OpenGL。当我运行一个使用 GLUT 创建新 OpenGL 窗口的示例程序时,它运行良好。好的。但是,在另一个程序的上下文中,我必须响应 Draw 事件(在 Windows 上),并将设备上下文传递给我 - 而且我可能没有可用的 GLUT - 我的困惑是:

  1. 何时创建和销毁设备上下文?我可以绘制给我的任何设备上下文,还是只绘制其中的一部分(我怎么知道)?

  2. 我必须创建自己的 OpenGL 上下文并使用它来绘制,还是可以使用“当前”OpenGL 上下文?每次发送绘图事件时,我是否必须重新创建上下文?

基本上我的问题是,在我收到“Draw”事件的情况下,我多久尝试一次创建 OpenGL 上下文以及这与设备上下文的创建/销毁周期有何关系?

【问题讨论】:

    标签: windows user-interface opengl drawing openglcontext


    【解决方案1】:

    通常,将单个 OpenGL 上下文视为一个窗口通常是安全的,尤其是在窗口上。

    设备上下文将(通常)映射到窗口句柄 (HWND)。它实际上是一个 DC(HDC 是句柄),但通常您会将一个 HDC 与一个 HWND 相关联。在 Windows 中,您将根据要渲染的屏幕上的窗口创建一个要使用的窗口。

    通常,您会在应用程序的整个运行时重用此设备上下文。如果要渲染到不同的窗口,则需要为新窗口句柄生成设备上下文 (HDC)。此外,屏幕外渲染有点不同,因为您也需要为此创建兼容的设备上下文。

    至于你的问题:

    1) 当您创建要在其中进行渲染的窗口时,您将获取一个设备上下文,并在该窗口的整个生命周期内使用它。

    2) 您会希望始终使用为您正在渲染的窗口创建的设备上下文。

    【讨论】:

    • 太棒了——我想这回答了我的问题。那么 OpenGL 上下文将几乎与 DC 1-1 相关联,对吧?我记得读过每个线程也只有一个上下文。那么,我假设不同的线程也会有不同的 DC?
    • 线程问题是不同的——当你创建一个 DC 时,你需要始终使用该线程来调用该 DC。一般来说,这意味着每个设备上下文(即:每个窗口)一个图形/渲染线程。
    猜你喜欢
    • 2017-03-23
    • 2015-07-07
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多