Code Project论坛上的一些用户问题让我意想到:互联网上的大大多数OpenGL教程曾经过期了。很多还在参考旧的NeHe教程,自从Jeff Molofee转向GameDev以后,这个教程就再也没有更新了。
从那时到如今,曾经发布了Visual Studio 2013和2015,另有Windows 7, 8 和Windows10。 所以,是时分创立一些契合新变更的根底教程了。
我们的目的很容易 - 在OpenGL窗口中生成规范立方体扭转位图。
从Windows 98Start,一切的Windows版本都自带OpenGL,所以你无需别的安装。Windows 7,8和10自带OpenGL 3.3.0,可是有点显卡制作商可能在他们的驱动中集成高版本的OpenGL,例如OpenGL 4.5。所以你可以以为在以后的Windows机械中,最少会带有OpenGL 3.3。
试图运用NeHe教程的人碰到的第一个问题多是GLAUX库曾经放弃,Visual Studio中不再包括,Windows中也没有响应的DLL。放弃的缘由是其功用可使用规范Win32 API挪用交换。在本系列文章中,我们会运用Win32 API挪用。我看了一切的关于下载GLAUX头文件和编译成DLL的评论,我们将会防止这类没有出路的做法。
我测验考试运用坚持容易直白的准绳( Keep It Simple Stupid (KISS) ),这部分代码不是工具(Objects)的或者框架化(Frameworks)的。不是由于我不置信这些工具,而是我们尽可能让代码容易,并让它有最普遍的用户。
代码运用规范的 <TChar.h> 接口,因而它能被 Ansi,Unicode 和宽字符形式编译。我们会商过不坚持 KISS 准绳,但如许就会限制编译形式,特殊长短英语国度。由于这触及到“char”类型与“TCHAR”的交流,一个很小的_T语句在字符串左近,我感到它关于了解来讲是有木懿睹的。
Start写代码
起首,让我们在OpenGL窗口系统中编写伪代码,我们凡是是以下编写:
初始化OpenGL(挪用一次)
丈量OpenGL视窗(初次挪用)
绘制场景
把场景迁徙到屏幕上
直到视窗封闭
留意事项:假如视窗巨细改动,那末丈量的过程也会被挪用
这个方法的缘由是由于它会使得包含OpenGL部分灵敏迁徙到像MFC、WPF等框架上。另外一个我所持的观念是把OpenGL数据输出到一个容易的构造上作为一个属性附加到视窗自身上。在这个教程中,人们想晓得为何只是容易的运用正常的全局变量,缘由不言而喻,在第二节课我们会运用多个OpenGL视窗和更多进步前辈的多视窗。
这是我们第一次课程要运用到的OpenGLData数据构造。这里描绘的代码片断在当前的课程中也会用到,而其他一些数据会依据需求而增减。在第一次课程中,我们会加载一张bitmap格局的图片作为纹理(构造中的glTexture),我会把纹理绘制在立方体的外表并扭转立方体(扭转运用了却构中的xrot, yrot)。
typedef struct OpenGLData { HGLRC Rc; // 绘制的句柄 **(老是需求) GLuint glTexture; // 要绘制的纹理 GLfloat xrot; // X扭转 GLfloat yrot; // Y扭转 } GLDATABASE;
代码片断如上。
那些根底的数据构造经过SetProp API函数被附加到了窗口的句柄上,被定义为了一个string类型的静态变量。当我们需求获得这个数据构造(OpenGLData)时,可以随时经过挪用GetProp来获得。
在这个教程中我们运用的标签的值是:
static const TCHAR* DATABASE_PROPERTY = _T("OurDataStructure");
我们采取下面的代码来创立数据构造并把数据构造附加到窗口的句柄上:
GLDATABASE* db = (GLDATABASE*) malloc(sizeof(GLDATABASE)); // 分派构造内存 db->Rc = InitGL(Wnd); // 初始化OpenGL保管着色情况 db->glTexture = 0; // 纹理置零 db->xrot = 0.0f; // 置零x扭转 db->yrot = 0.0f; // 置零y扭转 SetProp(Wnd, DATABASE_PROPERTY, (HANDLE) db); // 保管数据构造到窗口变量傍边
任何我们想要获得数据的时分,我们可以创立一个像如许的容易的挪用:
GLDATABASE* db = (GLDATABASE*) GetProp(Wnd, DATABASE_PROPERTY); //获得数据构造
这句代码标明,我们将会失掉一个规范窗口使用的框架。既然使用窗口曾经发生,WM_CREATE会被启用来初始化OpenGL系统。前往的Render内容会被保存在我们的数据构造中。ReSizeGLScene会直接在挪用Render以后,用它来设置OpenGL系统的初始巨细为创立的窗口巨细。
窗口曾经运转好了,我们接下来要做的就是处理窗口的WM_PAINT音讯问题,代码看起来会像如许:
case WM_PAINT: { // WM_PAINT音讯 PAINTSTRUCT Ps; GLDATABASE* db = (GLDATABASE*) GetProp(Wnd, DATABASE_PROPERTY); // 获得数据库 BeginPaint(Wnd, &Ps); // Start绘制 DrawGLScene(db, Ps.hdc); // 绘制OpenGL场景 SwapBuffers(Ps.hdc); // 交流缓冲区 EndPaint(Wnd, &Ps); // 完毕绘制 return 0; }
这段代码Start于通俗的BeginPaint挪用,可是接下来召唤OpenGL把它的场景绘制给render内容,在前往了以后,我们交流render的内容给PaintStructure装备,它可以给我们的窗口绘制OpenGL场景。接着,我们清算并加入。
窍门是衬着进程不是不断运转的,它仅仅发作在 WM_PAINT 音讯供给时,因而你盼望这些工具动起来,你就需求在更改以后供给 WM_PAINT 音讯。当我们启动按时器,更改扭转率,然后窗口仍是无效,这时候需求创立一个 WM_PAINT 音讯让窗口重绘。
这个进程是很棒的工具,像构建一个 3D 工具编辑器,除在疾速Mobile的游戏中不是很好,在这类场景中需求疾速不时衬着场景。在前面的课程中,我们将会处置这一进程并运用线程。
如今,运转程序并点击File菜单,选择load a bitmap并继续,你将会看到以下所示:
启动一个按时器,你的立方体应当Start扭转了,OpenGL在一个规范使用窗口中运转,这恰是你想看到的。我们第一个OpenGL教程就如许完成了。
在我们接下来的教程中,我们将会在一个MDI使用中睁开更多内容。
本文中的一切译文仅用于进修和交换目标,转载请务必注明文章译者、出处、和本文链接。 2KB翻译任务按照 CC 协议,假如我们的任务有进犯到您的权益,请实时联络我们。2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务