您的位置:首页 > 运维架构

Win32 OpenGL标准例子

2017-10-29 20:13 295 查看


原文: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 }


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: