openGL另一个版本学习笔记

注:这次所有的学习来源于这个网站。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;//保存程序的实例??

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值