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 }
分类: