Glut框架示例
本文遵循“署名-非商业用途-保持一致”创作公用协议
有了glut省事不少,不用去管烦琐的窗口创建,消息循环什么的,整了一个glut框架,作为以后demo的框架。
上图:
贴代码:
1 //=============================================================
2 // 包含头文件
3 //=============================================================
4 #include <gl/glew.h> // opengl 扩展封装头文件
5 #include <gl/glut.h> // opengl 实用工具头文件
6
7 //=============================================================
8 // 导入lib
9 //=============================================================
10 #pragma comment(lib, "glew32.lib")
11
12 //=============================================================
13 // 函数声明
14 //=============================================================
15 void Initialize(); // 初始化应用程序
16 void Uninitialize(); // 清理应用程序
17
18 void DrawFunc(); // glut描绘回调函数
19 void ReshapeFunc(int width, int height); // glut窗口重置回调函数
20 void KeyboardFunc(unsigned char key, int x, int y); // glut键盘回调函数
21 void MouseFunc(int button, int state, int x, int y);// glut鼠标按下与释放回调函数
22 void MotionFunc(int x, int y); // glut鼠标移动回调函数
23 void IdleFunc(); // glut空闲处理回调函数
24
25 void DrawText(const char* text, float x, float y); // 在屏幕上显示文本
26
27 //=============================================================
28 // 全局变量
29 //=============================================================
30 const static float EPSILON = 0.000001f;
31 const static float PI = 3.1415926f;
32 const static float PI_2 = 6.2831852f;
33
34 // 窗口相关
35 const static int g_WindowPosX = 240;
36 const static int g_WindowPosY = 200;
37 int g_WindowWidth = 512;
38 int g_WindowHeight = 384;
39 const char* g_WindowTitle = "OpenGL 飘飘白云(www.cnblogs.com/kesalin)";
40
41 // 显示模式:双缓冲,RGBA,深度缓存
42 const static int g_DisplayMode = (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); // GLUT_STENCIL GLUT_ACCUM
43 const static float g_fov = 60.0f;
44
45 float g_rotateY = 0.0f; // 绕Y轴旋转变量
46 float g_posX = 0.0f;
47
48 //=============================================================
49 // main 函数
50 //=============================================================
51 int main(int argc, char** argv)
52 {
53 // 初始化opengl, glut, glew
54 glutInit(&argc, argv);
55 glutInitDisplayMode(g_DisplayMode);
56 glewInit();
57
58 // 创建window
59 glutInitWindowPosition(g_WindowPosX, g_WindowPosY);
60 glutInitWindowSize(g_WindowWidth, g_WindowHeight);
61 glutCreateWindow(g_WindowTitle);
62
63 // 初始化应用程序
64 Initialize() ;
65
66 // 设定glut回调函数
67 glutDisplayFunc(DrawFunc);
68 glutReshapeFunc(ReshapeFunc);
69 glutKeyboardFunc(KeyboardFunc);
70 glutIdleFunc(IdleFunc);
71
72 // 进入glut事件处理循环
73 glutMainLoop();
74
75 // 清理应用程序
76 Uninitialize();
77
78 return 0;
79 }
80
81 //=============================================================
82 // 函数定义
83 //=============================================================
84
85 // 在屏幕上显示文本,x 和 y 为屏幕坐标
86 void DrawText(const char* text, float x, float y)
87 {
88 // 检查OpenGL状态
89 bool isDepthOpen = false;
90 bool isStencilOpen = false;
91 bool isLightOpen = false;
92 bool isFogOpen = false;
93
94 if(glIsEnabled(GL_DEPTH_TEST))
95 {
96 isDepthOpen = true;
97 glDisable(GL_DEPTH_TEST);
98 }
99 if(glIsEnabled(GL_STENCIL_TEST))
100 {
101 isStencilOpen = true;
102 glDisable(GL_STENCIL_TEST);
103 }
104 if(glIsEnabled(GL_LIGHTING))
105 {
106 isLightOpen = true;
107 glDisable(GL_LIGHTING);
108 }
109 if(glIsEnabled(GL_FOG))
110 {
111 isFogOpen = true;
112 glDisable(GL_FOG);
113 }
114
115 int font = (int)GLUT_BITMAP_8_BY_13;
116
117 // 设置字体颜色
118 glColor3f(1.0, 1.0, 0.0);
119
120 /*
121 * 设置正投影
122 */
123
124 glMatrixMode(GL_PROJECTION);
125
126 // 保存当前投影矩阵
127 glPushMatrix();
128
129 glLoadIdentity();
130 gluOrtho2D( 0, g_WindowWidth, 0, g_WindowHeight );
131
132 // 反转Y轴(朝下为正方向)(与窗口坐标一致)
133 glScalef(1, -1, 1);
134 // 将原点移动到屏幕左上方(与窗口坐标一致)
135 glTranslatef(0, -g_WindowHeight, 0);
136 glMatrixMode(GL_MODELVIEW);
137
138 // 保存当前模型视图矩阵
139 glPushMatrix();
140 glLoadIdentity();
141
142 // 设置文字位置
143 glRasterPos2f( x, y );
144
145 // 依次描绘所有字符(使用显示列表)
146 for(const char* c = text; *c != '\0'; c++)
147 {
148 glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, *c);
149 }
150
151 // 恢复之前保存的模型视图矩阵
152 glPopMatrix();
153
154 glMatrixMode(GL_PROJECTION);
155
156 // 恢复之前保存的投影矩阵
157 glPopMatrix();
158
159 // 返回模型视图矩阵状态
160 glMatrixMode(GL_MODELVIEW);
161
162 // 恢复OpenGL状态
163 if(isDepthOpen)
164 {
165 glEnable(GL_DEPTH_TEST);
166 }
167 if(isStencilOpen)
168 {
169 glEnable(GL_STENCIL_TEST);
170 }
171 if(isLightOpen)
172 {
173 glEnable(GL_LIGHTING);
174 }
175 if(isFogOpen)
176 {
177 glEnable(GL_FOG);
178 }
179 }
180
181 // 初始化应用程序
182 void Initialize()
183 {
184 // 设置清屏颜色
185 glClearColor (0.0, 0.0, 0.0, 0.0);
186
187 glShadeModel(GL_SMOOTH);
188 glEnable(GL_DEPTH_TEST);
189 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
190
191 // 设置视口,投影信息
192 glMatrixMode(GL_PROJECTION);
193 glLoadIdentity();
194 gluPerspective(g_fov, (GLfloat)g_WindowWidth/g_WindowHeight, 1.0, 30.0);
195 }
196
197 // 清理应用程序
198 void Uninitialize()
199 {
200 // nothing
201 }
202
203 // 空闲处理
204 void IdleFunc()
205 {
206 g_rotateY += 0.2f;
207
208 // 请求重绘
209 glutPostRedisplay();
210 }
211
212 // 描绘函数
213 void DrawFunc()
214 {
215 // 清屏
216 glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
217
218 glPushMatrix();
219 glTranslatef(g_posX, 0.0f, -5.0f);
220
221 // 描绘圆环
222 glPushMatrix();
223 glColor3f (0.0f, 0.0f, 1.0f);
224 glRotatef(g_rotateY, 0.0f, 1.0f, 0.0f);
225 glutSolidTorus(0.2f ,1.0f, 20, 40);
226 glPopMatrix();
227
228 // 描绘矩形
229 glPushMatrix();
230 glColor3f (0.0f, 1.0f, 1.0f);
231 glBegin(GL_QUADS);
232 glVertex3f (2.0f, -1.5f, 2.0f);
233 glVertex3f (-2.0f, -1.5f, 2.0);
234 glVertex3f (-2.0f, -1.5f, -2.0);
235 glVertex3f (2.0f, -1.50f, -2.0);
236 glEnd();
237 glPopMatrix();
238
239 glPopMatrix();
240
241 // 显示文本信息
242 float x = 10.0f;
243 float y = 20.0f;
244 DrawText("Author: kesalin@gmail.com", x, y);
245 DrawText("Push \'A\' or \'D\' to move the torus.", x, y + 20.0f);
246
247 // 交换显示缓冲区
248 glutSwapBuffers() ;
249 }
250
251 // 响应窗口重置事件
252 void ReshapeFunc(int width, int height)
253 {
254 g_WindowWidth = width;
255 g_WindowHeight = height;
256
257 glViewport(0, 0, g_WindowWidth, g_WindowHeight);
258 glMatrixMode(GL_PROJECTION);
259 glLoadIdentity();
260 gluPerspective(g_fov, (GLfloat)g_WindowWidth/g_WindowHeight, 1.0, 30.0);
261
262 glMatrixMode(GL_MODELVIEW);
263 glLoadIdentity();
264 }
265
266 // 响应按键事件
267 void KeyboardFunc(unsigned char key, int x, int y)
268 {
269 switch (key)
270 {
271 case 'A':
272 case 'a':
273 // 向左移动
274 g_posX -= 0.05f;
275 if( g_posX < -4.0f )
276 {
277 g_posX = -4.0f;
278 }
279 break;
280
281 case 'D':
282 case 'd':
283 // 向右移动
284 g_posX += 0.05f;
285 if( g_posX > 4.0f )
286 {
287 g_posX = 4.0f;
288 }
289 break;
290
291 default:
292 break;
293 }
294 }
295
296 // 响应鼠标按下与释放事件
297 void MouseFunc(int button, int state, int x, int y)
298 {
299 #if 0
300 switch( button )
301 {
302 case GLUT_LEFT_BUTTON:
303 {
304 if( state == GLUT_UP )
305 {
306 }
307 else if( state == GLUT_DOWN )
308 {
309 }
310 }
311 break;
312
313 case GLUT_RIGHT_BUTTON:
314 {
315 if( state == GLUT_UP )
316 {
317 }
318 else if( state == GLUT_DOWN )
319 {
320 }
321 }
322 break;
323
324 case GLUT_MIDDLE_BUTTON:
325 {
326 if( state == GLUT_UP )
327 {
328 }
329 else if( state == GLUT_DOWN )
330 {
331 }
332 }
333 break;
334 }
335 #endif
336 }
337
338 // 响应鼠标移动事件
339 void MotionFunc(int x, int y)
340 {
341 // nothing
342 }
343