Win32 OpenGL标准例子
【摘要】 原文:http://www.cnblogs.com/wurui1994/p/6058882.html
Win32 OpenGL标准例子
在VS2008的MSDN中有一个标准的OpenGL例子,记录如下: 1 /*
2 * Example of a Win32 OpenGL program.
3 * The OpenGL co...
原文:http://www.cnblogs.com/wurui1994/p/6058882.html
Win32 OpenGL标准例子
在VS2008的MSDN中有一个标准的OpenGL例子,记录如下:
1 /*
2 * Example of a Win32 OpenGL program.
3 * The OpenGL code is the same as that used in
4 * the X Window System sample
5 */
6 #include <windows.h>
7 #include <GL/gl.h>
8 #include <GL/glu.h>
9
10 /* Windows globals, defines, and prototypes */
11 CHAR szAppName[]="Win OpenGL";
12 HWND ghWnd;
13 HDC ghDC;
14 HGLRC ghRC;
15
16 #define SWAPBUFFERS SwapBuffers(ghDC)
17 #define BLACK_INDEX 0
18 #define RED_INDEX 13
19 #define GREEN_INDEX 14
20 #define BLUE_INDEX 16
21 #define WIDTH 640
22 #define HEIGHT 480
23
24 LONG WINAPI MainWndProc (HWND, UINT, WPARAM, LPARAM);
25 BOOL bSetupPixelFormat(HDC);
26
27 /* OpenGL globals, defines, and prototypes */
28 GLfloat latitude, longitude, latinc, longinc;
29 GLdouble radius;
30
31 #define GLOBE 1
32 #define CYLINDER 2
33 #define CONE 3
34
35 GLvoid resize(GLsizei, GLsizei);
36 GLvoid initializeGL(GLsizei, GLsizei);
37 GLvoid drawScene(GLvoid);
38 void polarView( GLdouble, GLdouble, GLdouble, GLdouble);
39
40 int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
41 {
42 MSG msg;
43 WNDCLASS wndclass;
44
45 /* Register the frame class */
46 wndclass.style = 0;
47 wndclass.lpfnWndProc = (WNDPROC)MainWndProc;
48 wndclass.cbClsExtra = 0;
49 wndclass.cbWndExtra = 0;
50 wndclass.hInstance = hInstance;
51 wndclass.hIcon = LoadIcon (hInstance, szAppName);
52 wndclass.hCursor = LoadCursor (NULL,IDC_ARROW);
53 wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
54 wndclass.lpszMenuName = szAppName;
55 wndclass.lpszClassName = szAppName;
56
57 if (!RegisterClass (&wndclass) )
58 return FALSE;
59
60 /* Create the frame */
61 ghWnd = CreateWindow (szAppName,
62 "Generic OpenGL Sample",
63 WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
64 CW_USEDEFAULT,
65 CW_USEDEFAULT,
66 WIDTH,
67 HEIGHT,
68 NULL,
69 NULL,
70 hInstance,
71 NULL);
72
73 /* make sure window was created */
74 if (!ghWnd)
75 return FALSE;
76
77 /* show and update main window */
78 ShowWindow (ghWnd, nCmdShow);
79
80 UpdateWindow (ghWnd);
81
82 /* animation loop */
83 while (1)
84 {
85 /*
86 * Process all pending messages
87 */
88
89 while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) == TRUE)
90 {
91 if (GetMessage(&msg, NULL, 0, 0) )
92 {
93 TranslateMessage(&msg);
94 DispatchMessage(&msg);
95 }
96 else
97 {
98 return TRUE;
99 }
100 }
101 drawScene();
102 Sleep(10);
103 }
104 }
105
106 /* main window procedure */
107 LONG WINAPI MainWndProc (
108 HWND hWnd,
109 UINT uMsg,
110 WPARAM wParam,
111 LPARAM lParam)
112 {
113 LONG lRet = 1;
114 PAINTSTRUCT ps;
115 RECT rect;
116
117 switch (uMsg)
118 {
119
120 case WM_CREATE:
121 ghDC = GetDC(hWnd);
122 if (!bSetupPixelFormat(ghDC))
123 PostQuitMessage (0);
124
125 ghRC = wglCreateContext(ghDC);
126 wglMakeCurrent(ghDC, ghRC);
127 GetClientRect(hWnd, &rect);
128 initializeGL(rect.right, rect.bottom);
129 break;
130
131 case WM_PAINT:
132 BeginPaint(hWnd, &ps);
133 EndPaint(hWnd, &ps);
134 break;
135
136 case WM_SIZE:
137 GetClientRect(hWnd, &rect);
138 resize(rect.right, rect.bottom);
139 break;
140
141 case WM_CLOSE:
142 if (ghRC)
143 wglDeleteContext(ghRC);
144 if (ghDC)
145 ReleaseDC(hWnd, ghDC);
146 ghRC = 0;
147 ghDC = 0;
148
149 DestroyWindow (hWnd);
150 break;
151
152 case WM_DESTROY:
153 if (ghRC)
154 wglDeleteContext(ghRC);
155 if (ghDC)
156 ReleaseDC(hWnd, ghDC);
157
158 PostQuitMessage (0);
159 break;
160
161 case WM_KEYDOWN:
162 switch (wParam)
163 {
164 case VK_LEFT:
165 longinc += 0.5F;
166 break;
167 case VK_RIGHT:
168 longinc -= 0.5F;
169 break;
170 case VK_UP:
171 latinc += 0.5F;
172 break;
173 case VK_DOWN:
174 latinc -= 0.5F;
175 break;
176 }
177
178 default:
179 lRet = DefWindowProc (hWnd, uMsg, wParam, lParam);
180 break;
181 }
182
183 return lRet;
184 }
185
186 BOOL bSetupPixelFormat(HDC hdc)
187 {
188 PIXELFORMATDESCRIPTOR pfd, *ppfd;
189 int pixelformat;
190
191 ppfd = &pfd;
192
193 ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR);
194 ppfd->nVersion = 1;
195 ppfd->dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL |
196 PFD_DOUBLEBUFFER;
197 ppfd->dwLayerMask = PFD_MAIN_PLANE;
198 ppfd->iPixelType = PFD_TYPE_COLORINDEX;
199 ppfd->cColorBits = 8;
200 ppfd->cDepthBits = 16;
201 ppfd->cAccumBits = 0;
202 ppfd->cStencilBits = 0;
203
204 pixelformat = ChoosePixelFormat(hdc, ppfd);
205
206 if ( (pixelformat = ChoosePixelFormat(hdc, ppfd)) == 0 )
207 {
208 MessageBox(NULL, "ChoosePixelFormat failed", "Error", MB_OK);
209 return FALSE;
210 }
211
212 if (SetPixelFormat(hdc, pixelformat, ppfd) == FALSE)
213 {
214 MessageBox(NULL, "SetPixelFormat failed", "Error", MB_OK);
215 return FALSE;
216 }
217
218 return TRUE;
219 }
220
221 /* OpenGL code */
222
223 GLvoid resize( GLsizei width, GLsizei height )
224 {
225 GLfloat aspect;
226
227 glViewport( 0, 0, width, height );
228
229 aspect = (GLfloat) width / height;
230
231 glMatrixMode( GL_PROJECTION );
232 glLoadIdentity();
233 gluPerspective( 45.0, aspect, 3.0, 7.0 );
234 glMatrixMode( GL_MODELVIEW );
235 }
236
237 GLvoid createObjects()
238 {
239 GLUquadricObj *quadObj;
240
241 glNewList(GLOBE, GL_COMPILE);
242 quadObj = gluNewQuadric ();
243 gluQuadricDrawStyle (quadObj, GLU_LINE);
244 gluSphere (quadObj, 1.5, 16, 16);
245 glEndList();
246
247 glNewList(CONE, GL_COMPILE);
248 quadObj = gluNewQuadric ();
249 gluQuadricDrawStyle (quadObj, GLU_FILL);
250 gluQuadricNormals (quadObj, GLU_SMOOTH);
251 gluCylinder(quadObj, 0.3, 0.0, 0.6, 15, 10);
252 glEndList();
253
254 glNewList(CYLINDER, GL_COMPILE);
255 glPushMatrix ();
256 glRotatef ((GLfloat)90.0, (GLfloat)1.0, (GLfloat)0.0, (GLfloat)0.0);
257 glTranslatef ((GLfloat)0.0, (GLfloat)0.0, (GLfloat)-1.0);
258 quadObj = gluNewQuadric ();
259 gluQuadricDrawStyle (quadObj, GLU_FILL);
260 gluQuadricNormals (quadObj, GLU_SMOOTH);
261 gluCylinder (quadObj, 0.3, 0.3, 0.6, 12, 2);
262 glPopMatrix ();
263 glEndList();
264 }
265
266 GLvoid initializeGL(GLsizei width, GLsizei height)
267 {
268 GLfloat maxObjectSize, aspect;
269 GLdouble near_plane, far_plane;
270
271 glClearIndex( (GLfloat)BLACK_INDEX);
272 glClearDepth( 1.0 );
273
274 glEnable(GL_DEPTH_TEST);
275
276 glMatrixMode( GL_PROJECTION );
277 aspect = (GLfloat) width / height;
278 gluPerspective( 45.0, aspect, 3.0, 7.0 );
279 glMatrixMode( GL_MODELVIEW );
280
281 near_plane = 3.0;
282 far_plane = 7.0;
283 maxObjectSize = 3.0F;
284 radius = near_plane + maxObjectSize/2.0;
285
286 latitude = 0.0F;
287 longitude = 0.0F;
288 latinc = 6.0F;
289 longinc = 2.5F;
290
291 createObjects();
292 }
293
294 void polarView(GLdouble radius, GLdouble twist, GLdouble latitude,
295 GLdouble longitude)
296 {
297 glTranslated(0.0, 0.0, -radius);
298 glRotated(-twist, 0.0, 0.0, 1.0);
299 glRotated(-latitude, 1.0, 0.0, 0.0);
300 glRotated(longitude, 0.0, 0.0, 1.0);
301
302 }
303
304 GLvoid drawScene(GLvoid)
305 {
306 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
307
308 glPushMatrix();
309
310 latitude += latinc;
311 longitude += longinc;
312
313 polarView( radius, 0, latitude, longitude );
314
315 // glIndexi(RED_INDEX);
316 glColor3f(1,0,0);
317 glCallList(CONE);
318
319 // glIndexi(BLUE_INDEX);
320 glColor3f(0,0,1);
321 glCallList(GLOBE);
322
323 // glIndexi(GREEN_INDEX);
324 glColor3f(0,1,0);
325 glPushMatrix();
326 glTranslatef(0.8F, -0.65F, 0.0F);
327 glRotatef(30.0F, 1.0F, 0.5F, 1.0F);
328 glCallList(CYLINDER);
329 glPopMatrix();
330
331 glPopMatrix();
332
333 SWAPBUFFERS;
334 }
文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/jacke121/article/details/78387519
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)