2016-11-10 45 views
0

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

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

HDC hdc; 

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

这将打印

HDC: 0 

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

我发现很多教程在线,但它们都使用GLUT,GLEW,GLFW,X11,SDL等,这些库。图书馆使某些事情变得更容易,但他们通常不执行不使用它们的不可能完成的任务。这一次,我想尝试以艰难的方式做事,因此不使用库,只是简单的OpenGL。

我发现,在去年,a tutorial只有使用Windows库用于创建一个窗口。

+0

我也这么认为,但文章主要是关于创建一个OpenGL上下文,而我需要的上下文是一个设备上下文。文章指出:“你应该知道窗口句柄(HWND)和设备上下文(DC)是什么,以及如何创建它们。” –

+0

所以你的意思是代码不适用于这种情况。我认为你可能是对的,但这个问题成为我必须创建一个问题。 –

+0

对不起,你是对的;因为它是一个WGL函数,所以我把它误认为是'wglGetCurrentContext'。 –

回答

3

你不说出你的OS但我认为Windows在功能名称。问题正如Reto Koradi在评论中所述。要设置的OpenGL你需要这样做:

  1. 获取OS手柄,有效的设备上下文

    反对它可以是OS窗口或OS位图。如果你只是控制台应用程序,那么你需要首先创建一个有效的窗口,然后使用它的句柄(我的知识控制台没有Canvas)。

    可以使用GLUT的窗口创建或者如果你的编译IDE有一个窗口应用程序,你可以使用它。您还可以结合使用OpenGL和Window组件。 VCL也是没有问题的(我用了多年与的OpenGL

    在你可以使用CreateWindowEx所以谷歌它的一个示例窗...

    反正你应该有你的手柄一个变量,如:

    HWND hwin=NULL; 
    

    如果您有与Windows应用程序的经验,然后使用GLUT这一点。否则,您需要学习很多东西来涵盖窗口创建,事件消息处理以及用户/应用程序交互,这对于没有向导的新手来说可能真是压倒一切。对于

  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的:

您可以使用GLUT所有这一切。这是第一次打我发现通过快速搜索:

或者遵循的OpenGL教程有吨他们在那里......

+0

对不起,我没有提到我的操作系统。正如你已经猜到的那样,它是窗户。至于你所描述的步骤:我得到3,4和5,因为它们在我使用的wiki文章中有相当清楚的描述。感谢您明确表示我首先必须创建一个窗口。关于使用GLUT ... GLUT是一个库,这意味着也许还有一种方法来创建一个窗口而不使用它? CreateWindow或CreateWindowEx可能工作,所以我会尝试。谢谢。 –