OpenGL 获取设备上下文

OpenGL get Device Context

我正在尝试在 windows 上创建一个 OpenGL 应用程序。据我所知,我必须获得的第一件事就是设备上下文,它必须传递给几个选择和设置像素格式并创建渲染上下文的函数。我使用 the OpenGL wiki 来大致了解我应该做什么。 我的代码是这样的:

#include <iostream>
#include <windef.h>
#include <wingdi.h>

HDC hdc;

int main() {
    hdc = wglGetCurrentDC();
    std::cout << "HDC: " << hdc << std::endl;
    return 0;
}

这会打印

HDC: 0

我假设设备上下文指的是物理设备,但我在某处读到它指的是任何可绘制对象 "surface"。在这两种情况下,我的问题是:如何获得非空 DC?或者我应该执行一组完全不同的步骤来设置整个 OpenGL 系统?

网上找了很多教程,但是都是用到GLUT、GLEW、GLFW、X11、SDL等库。库使某些事情变得更容易,但它们通常不会执行不使用它们就不可能完成的任务。这一次,我想尝试以困难的方式做事,因此不使用任何库,只使用普通的 OpenGL。

我终于发现 a tutorial 只使用 windows 库来创建 window。

你没有说明你的 OS 但我从函数名称中假设 Windows。问题正如 Reto Koradi 在评论中所说的那样。要设置 OpenGL,您需要执行以下操作:

  1. 获取OS具有有效设备上下文的对象句柄

    可以是OSwindow或OS位图。如果您只有控制台应用程序,那么您需要先创建一个有效的 OS window 并使用它的句柄(据我所知,控制台没有 Canvas).

    您可以使用 GLUT 创建 window 或者如果您的编译器 IDE 有一个 window 您可以使用的应用程序。您还可以组合 OpenGL 和 Window 组件。 VCL 也不是问题(我在 OpenGL 上使用了很多年)

    在 windows 中你可以使用 CreateWindowEx 所以 google 一个例子...

    无论如何你应该把你的句柄放在一个变量中,比如:

    HWND hwin=NULL;
    

    如果您没有使用 windows 应用程序的经验,那么请使用 GLUT。否则,您将需要学习很多东西来涵盖 window 创建、事件的消息处理和 user/app 交互,这对于没有指导的菜鸟来说真的是难以承受。

  2. 获取该句柄的设备上下文

    HDC hdc = GetDC(hwin);
    
  3. 设置设备上下文所需的像素格式

    PIXELFORMATDESCRIPTOR pfd;
    ZeroMemory( &pfd, sizeof( pfd ) );      // set the pixel format for the DC
    pfd.nSize = sizeof( pfd );
    pfd.nVersion = 1;
    pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    pfd.iPixelType = PFD_TYPE_RGBA;
    pfd.cColorBits = 24;
    pfd.cDepthBits = 24;
    pfd.iLayerType = PFD_MAIN_PLANE;
    SetPixelFormat(hdc,ChoosePixelFormat(hdc, &pfd),&pfd);
    
  4. 为设备上下文创建 OpenGL 渲染上下文

    HGLRC hrc = wglCreateContext(hdc);
    
  5. 将其设置为默认 OpenGL 上下文

    wglMakeCurrent(hdc, hrc);
    

这是没有任何错误检查、额外缓冲区等的绝对​​最小值。有关更多信息和实际代码,请参阅相关的 QA

  • How to render an openGL frame in C++ builder? 旧式 GL
  • 有了新东西

您可以使用 GLUT 来完成所有这些。这是我通过快速搜索找到的第一个命中:

  • How can I set an OpenGL display (Window created by OpenGL) to maximized?

或遵循 OpenGL 教程,那里有很多...