您的位置:首页 > 运维架构

openGL另一个版本学习笔记

2013-08-24 17:18 309 查看
注:这次所有的学习来源于这个网站。http://nehe.gamedev.net/tutorial/creating_an_opengl_window_(win32)/13001/

这个网站的站长是一个很值得尊敬的人!这里的笔记全是写上“转载”标签(尽管很多时候会提出自己的疑问,我不会完全照搬他的文字,因为这是我学习这个的笔记。)

我承诺:在我把这个学习完成之后,一定总结整理出一份完整的笔记,将该站长的精神传承下去!

再次,向这样无私且大牛的人致敬。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

lesson 01:创建一个窗口,支持缺省窗口大小和最大化运行,按Esc键退出。

环境介绍:我用的是windows7操作系统,vc6.0集成开发环境,i3处理器。

1、包含头文件

<windows.h> <gl\gl.h> <gl\glu.h> <gl\glut.h> <gl\glaux.h>

常见的就是上面几个,具体干什么的不是很清楚。

<windows.h>:因为在openGL标准中只有<gl.h><glu.h>这两个头文件,但是这两个头文件中的函数没有提供比如“创建一个openGL像素窗口”或者“监听鼠标、按键”等这样的功能,所以如果我们要用一个函数创建一个openGL窗口,就需要用到“其它的头文件”,比如<glut.h>或<glaux.h>。这个时候我们就要在包含<glut.h>或<glaux.h>之前含<windows.h>,因为这样我们才能用到<glut.h>或<glaux.h>对应的库文件(应该称为“动态库”)中的实现函数(应该说是“二进制可执行代码”)。

<gl\gl.h>:这个头文件和<gl/glu.h>构成openGL的标准(难道openGL标准就是这两个头文件?这与其它标准“相差”也太大了吧,比如STL标准、posix标准、ieee754标准等。难道openGL定义的标准只是规定这两个头文件中声明的接口(也就是声明的函数)所实现的功能?)。那么<gl.h>中有哪些函数呢?所有我们看到的glXXX()函数,都是在<gl.h>中声明的。这是一些核心函数。比如:glBegin(),glEnd(),glFlush();glVertex*()等。我在想是不是需要整理一份详细介绍<gl.h>中函数的文档出来呢?

<gl\glu.h>:如上所说,这个头文件和<gl\gl.h>构成openGL的标准,那么这个头文件中定义的接口是干什么的呢?

嗯,现在还没有看到这类函数,即gluXXX()。这个库被称为openGL实用库。我想它的功能应该就是创建窗口之类的,但是!不是这样!

这个头文件并不长,只有大概300行。来,看看里面都有什么吧!

#ifndef __glu_h__

#define __glu_h__ //这不用说,是头文件保护符

#define __GNUC_H

#if __GNUC__ >= 3 //显然这句是看不懂的?

#pragma GCC system_header //显然,这句也是?

#endif

#include <stddef.h>//c标准头文件

#include <GL/gl.h> /*经常,在windows下分割目录用的是“正or反”斜杠?系统自己是——“C:\window\system”。但是在程序中想用绝对路径,得这样写:

ifstream fin("D:/asciiFile/123.txt", ios::in);这倒跟这个库#include <GL/gl.h>一致。*/

#ifdef __cplusplus

extern "C" {

#endif /**这一段,一直不明白*/

/**************************************************************************************/

/* Boolean */

#define GLU_FALSE 0

#define GLU_TRUE 1

/* ErrorCode */

#define GLU_INVALID_ENUM 100900

#define GLU_INVALID_VALUE 100901

#define GLU_OUT_OF_MEMORY 100902

#define GLU_INVALID_OPERATION 100904

/* QuadricDrawStyle */

#define GLU_POINT 100010

#define GLU_LINE 100011

#define GLU_FILL 100012

#define GLU_SILHOUETTE 100013

//等很多这样类似的宏定义。

//然后看一下函数的声明

#ifdef __cplusplus

class GLUnurbs;

class GLUquadric;

class GLUtesselator;

#else

typedef struct GLUnurbs GLUnurbs;

typedef struct GLUquadric GLUqudric;

typedef struct GLUtesselator GLUtesselator;

#endif

typedef GLUnurbs GLUnurnsObj;

typedef GLUquadric GLUquadricObj;

typedef GLUtesselator GLUtesselatorObj;

typedef GLUtesselator GLUtriangulatorObj;

#define GLU_TESS_MAX_COORD 1.0e150

/* Internal convenience typedefs */

typedef void (APIENTRY *_GLUfuncptr) ();

GLAPI void APIENTRY gluBeginCurve (GLUnurbs *nurb);

/*关于这个函数的解释:

1、GLAPI

GLAPI不是在这个头文件中定义的(我在这个头文件中找遍了)。

GLAPI是在<gl/gl.h>中定义的,

#if defined(__WIN32__) && defined(WINGDIAPI)

#define GLAPI WINGDIAPI //那么WINGDIAPI是什么呢?这个没有找到啊!~估计应该是extern。不知道对不对?

#endif

找到了

/* GLAPI, part 2 */

#if !defined(GLAPI)

#if defined(_MSC_VER)

#define GLAPI __declspec(dllimport)

#elif defined(__LCC__) && defined(__WIN32__)

#define GLAPI __sdcall

#else

#define GLAPI extern

#endif

#endif

2、APIENTRY

也是定义在<gl/gl.h>头文件中

#if !defined(APIENTRY)

#if defined(__WIN32__)

#define APIENTRY __stdcall

#else

#define APIENTRY

#endif

#endif

-----------

ok!~所以上面这个函数就可以等价成这样:

extern void __stdcall gluBeginCurve (GLUnurbs *nurbs);

但是这个函数是干什么的,还不清楚~~

-----------

*/

然后就是很多这样的函数定义,显然这些函数也不是用于“窗口创建”和“事件监听”这类的。

#endif //__glut_h__

上面程序加入了必须的头文件。现在开始程序正文:

HGLRC hRC = NULL;//窗口着色描述表句柄??

HDC hDC = NULL;//openGL渲染描述表句柄??

HWND hWnd = NULL;//保存我们的窗口句柄??

HINSTANCE hInstance;//保存程序的实例??
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: