我正在尝试在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
我假设设备上下文是指物理设备,但我在某处读到它指的是任何可绘制的表面&#34;。在这两种情况下都是我的问题:如何获得非空DC?或者我应该执行一组完全不同的步骤来设置整个OpenGL系统?
我在网上发现了很多教程,但他们都使用GLUT,GLEW,GLFW,X11,SDL等库。库使某些事情变得更容易,但是它们通常不执行不使用它们就不可能执行的任务。这次,我想尝试以艰难的方式做事,因此不使用任何库,只需简单的OpenGL。
我终于发现a tutorial只使用了windows库来创建一个窗口。
答案 0 :(得分:3)
您没有说明操作系统,但我从功能名称中假设Windows。问题正如Reto Koradi在评论中所述。要设置 OpenGL ,您需要执行以下操作:
获取具有有效设备上下文的对象的OS句柄
可以是 OS 窗口或 OS 位图。如果你只有控制台应用程序,那么你需要先创建一个有效的操作系统窗口并使用它的句柄(我的知识控制台没有Canvas)。
您可以使用 GLUT 进行窗口创建,或者如果您的编译器 IDE 有一个窗口App,您可以使用它。您还可以组合 OpenGL 和Window组件。 VCL 也不是问题(我使用它多年 OpenGL )
在Windows中,您可以使用CreateWindowEx,以便谷歌举例说明......
无论如何,你应该把你的句柄放在一个变量中:
HWND hwin=NULL;
如果您没有使用Windows应用程序的经验,请使用 GLUT 。否则你需要学习很多东西,只是为了覆盖窗口创建,事件的消息处理和用户/应用程序交互,对于没有指南的菜鸟而言,这可能真的是压倒性的。
获取该句柄的设备上下文
HDC hdc = GetDC(hwin);
设置您需要设备上下文的像素格式
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);
为设备上下文创建OpenGL呈现上下文
HGLRC hrc = wglCreateContext(hdc);
将其设置为默认的OpenGL上下文
wglMakeCurrent(hdc, hrc);
这是绝对最小值,没有任何错误检查,额外的缓冲区等。有关更多信息和实际代码,请参阅相关的 QA :
您可以使用 GLUT 来完成所有这些操作。这是我通过快速搜索找到的第一个打击:
或者按照 OpenGL 教程,那里有很多人......