OpenGL自学教程1(窗口建立)

虚拟手术项目中需要用到OpenGL,但是方便起见选择了GLUT,省去了一大堆窗口注册的麻烦!因为是刚刚开始接触这个东西,学起来也比较慢,想在这里记录一下自己学习的过程!
网上有个NeHe写的OpenGL教程,非常详细,当然也有人用GLUT将其实现的,这一点很佩服老外的东西,既好还给你开放出来,给我们这些菜鸟级的人物提供了许多方便!
废话不多说,这回写的是第一个窗口,没有任务内容,只是一个带有“询问是否进行全屏显示”的对话框,然后出现一个全黑的窗口,代码如下:

代码
1 /*
2 NeHe教程的第一课,生成一个游戏界面的窗口,
3 询问是否使用全屏游戏模式:true 进入全屏
4 false:则为窗口模式
5  */
6
7  /*
8 作者:俞超
9 时间:2010.11.02
10  */
11
12 #include <windows.h> //Windows程序标准的头文件
13 #include <GL/glut.h> //glut头文件
14
15 //这条语句可以去除控制台
16 #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
17
18 //添加库文件
19 #pragma comment(lib,"opengl32.lib")
20 #pragma comment(lib,"glu32.lib")
21 #pragma comment(lib,"glut32.lib")
22
23 //全局变量
24 bool g_gamemode; //是否使用游戏的全屏模式
25 bool g_fullscreen; //全屏模式
26
27 //初始化函数
28 bool init(void)
29 {
30 glShadeModel(GL_SMOOTH); // 开启平滑阴影模式
31 glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // 黑色背景
32 glClearDepth(1.0f); // 深度缓存
33 glEnable(GL_DEPTH_TEST); // 开启深度缓存
34 glDepthFunc(GL_LEQUAL); // 深度缓存测试的类型
35 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 启动反锯齿模式
36 return true;
37 }
38
39 //绘制函数
40 void render(void)
41 {
42 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕内容和深度缓存内容
43 glLoadIdentity(); // 重置模型视觉的矩阵
44
45 // 交换前后缓存内容
46 glutSwapBuffers ( );
47 }
48
49 //窗口大小改变回调函数
50 void reshape(int w,int h)
51 {
52 glViewport(0, 0, w, h);
53 glMatrixMode(GL_PROJECTION); // 选择投影矩阵
54 glLoadIdentity(); // 重置投影矩阵
55
56 if (h == 0) h = 1;
57 // 计算方位角,并设置透视的 角度
58 gluPerspective(80, (float)w/(float)h, 1.0, 5000.0);
59 glMatrixMode(GL_MODELVIEW); // 选择模型视图矩阵
60 glLoadIdentity(); // 重置模型视图矩阵
61 }
62
63 //按钮回调函数
64 void keyboard(unsigned char key,int x,int y)
65 {
66 switch (key) {
67 case 27: // 如果按下Esc
68 exit(0); // 退出程序
69 break;
70 default:
71 break;
72 }
73 }
74
75 //特殊键回调函数
76 void special_keys(int a_keys,int x,int y)
77 {
78 switch (a_keys) {
79 case GLUT_KEY_F1:
80 // 切换全屏模型和窗口模型,由F1按键确定
81 if (!g_gamemode) {
82 g_fullscreen = !g_fullscreen; // 触发全民开头
83 if (g_fullscreen) glutFullScreen(); // We Went In Fullscreen Mode
84 else glutReshapeWindow(500, 500); // We Went In Windowed Mode
85 }
86 break;
87 default:
88 break;
89 }
90 }
91
92 //弹出询问窗口
93 void ask_gamemode()
94 {
95 int answer;
96 // 询问是否使用全屏游戏模式
97 answer = MessageBox(NULL, "Do you want to enter game mode?", "Question",
98 MB_ICONQUESTION | MB_YESNO);
99 g_gamemode = (answer == IDYES);
100 // 如果没有选择全屏模式则进入窗口模式
101 g_fullscreen = false;
102 }
103
104 //主函数
105 int main(int argc,char** argv)
106 {
107 ask_gamemode(); // 询问是否全屏模型
108 glutInit(&argc, argv); // Glut初始化函数
109 glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); // 显示的模型,一般都为RGB|DOUBLE
110 if (g_gamemode) {
111 glutGameModeString("640x480:16"); // 进入 640x480 16像素的模型
112 if (glutGameModeGet(GLUT_GAME_MODE_POSSIBLE))
113 glutEnterGameMode(); // 进入全屏
114 else g_gamemode = false; // 如果不能进入全屏模式,则回到窗口模式
115 }
116 if (!g_gamemode) {
117 glutInitWindowSize(500, 500); // 窗口模式的大小
118 glutCreateWindow("NeHe's OpenGL Framework"); // 窗体抬头的标题
119 }
120 init(); // 自定义的初始化函数
121 glutDisplayFunc(render); // 注册显示回调函数
122 glutReshapeFunc(reshape); // 注册窗口大小改变回调函数
123 glutKeyboardFunc(keyboard); // 注册键盘回调函数
124 glutSpecialFunc(special_keys); // 注册特殊键盘回调函数
125 glutMainLoop(); // 进入Glut循环
126 return 0;
127 }
原文地址:https://www.cnblogs.com/yuchao/p/1867488.html