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;//保存程序的实例??
这个网站的站长是一个很值得尊敬的人!这里的笔记全是写上“转载”标签(尽管很多时候会提出自己的疑问,我不会完全照搬他的文字,因为这是我学习这个的笔记。)
我承诺:在我把这个学习完成之后,一定总结整理出一份完整的笔记,将该站长的精神传承下去!
再次,向这样无私且大牛的人致敬。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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;//保存程序的实例??
相关文章推荐
- OpenGL学习笔记:版本和扩展
- OpenGL编程指南第版本学习笔记 --- OpenGL程序实现过程(win32 + OpenGL)
- opengl学习笔记(一)---获取opengl版本等信息
- OpenCV2.4版本学习笔记(一)
- 数字证书,SSL,版本授权,HTTP加密学习笔记
- OpenGL学习笔记
- OpenGL学习笔记:状态机理念
- OpenGL_Qt学习笔记之_01(创建一个OpenGL窗口)
- OpenGL学习笔记(九)
- Git学习笔记(一)—— Git安装及版本库创建
- fatfs 学习笔记--f_open用法(最新版本)
- Android OpenGL学习笔记(二)之----三角形的绘制.
- fatfs 学习笔记--f_write用法(最新版本R0.13)
- opengl 学习笔记1
- ElasticSearch 6.x 学习笔记:9.版本控制
- TensorFlow学习笔记--1.0 版本的更改
- OpenGL学习笔记索引
- OPENGL学习笔记之九
- opengl学习笔记——着色器创建
- OpenGL学习笔记6:高级纹理知识