Win32 OpenGL标准例子

举报
风吹稻花香 发表于 2021/06/05 00:53:22 2021/06/05
【摘要】 原文: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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。