Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 |
#include <iostream> #include <windows.h> // Header Datei für Windows #include <gl\gl.h> // Header Datei für die OpenGL32 Library #include <gl\glu.h> // Header Datei für die GLu32 Library #include <gl\glaux.h> // Header Datei für die GLaux Library HGLRC hRC=NULL; // Permanenter Rendering Context HDC hDC=NULL; // Privater GDI Device Context HWND hWnd=NULL; // Enthält unser Fenster-Handle HINSTANCE hInstance; // Enthält die Instanz der Applikation bool keys[256]; // Array das für die Tastatur Routine verwendet wird bool active=TRUE; // Fenster Aktiv Flag standardmäßig auf TRUE gesetzt bool fullscreen=TRUE; // Fullscreen Flag ist standardmäßig auf TRUE gesetzt LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Deklaration für WndProc GLvoid ReSizeGLScene(GLsizei width, GLsizei height) // verändert die Größe und initialisiert das GL-Fenster if (height==0) // Verhindere eine Divison durch 0, indem die Höhe auf 1 gesetzt wird { height=1; } glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); // wähle die Projektions-Matrix aus glLoadIdentity(); // Resette die Projektions-Matrix gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f); // berechne das Seitenverhältnis des Fensters glMatrixMode(GL_MODELVIEW); // Wähle die Modelview Matrix aus glLoadIdentity(); // Resette die Modelview Matrix // End ReSizeGLScene } int InitGL(GLvoid) // Der ganze Setup Kram für OpenGL kommt hier rein { glShadeModel(GL_SMOOTH); // aktiviert weiches Shading (Smooth Shading) glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepth(1.0f); // Depth Buffer Setup glEnable(GL_DEPTH_TEST); // aktiviert Depth Test glDepthFunc(GL_LEQUAL); // Die Art des auszuführenden Depth Test glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // wirklich nette Perspektiven Berechnungen return TRUE; // Initialisierung war OK } int DrawGLScene(GLvoid) // Hier kommt der ganze Zeichnen-Kram hin { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Lösche den Bildschirm und den Depth-Buffer glLoadIdentity(); // Resettet die aktuelle Modelview Matrix return TRUE; // Alles war OK } GLvoid KillGLWindow(GLvoid) // Entferne das Fenster korrekt { if (fullscreen) // Sind wir im Fullscreen Modus? { ChangeDisplaySettings(NULL,0); // Wenn ja, wechsle zurück zum Desktop ShowCursor(TRUE); // Zeige den Maus-Zeiger } if (hRC) // Haben wir einen Rendering Context? { if (!wglMakeCurrent(NULL,NULL)) // Können wir den DC und RC Kontext freigeben? { MessageBox(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); } if (!wglDeleteContext(hRC)) // Können wir den RC löschen? { MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); } hRC=NULL; // Setze RC auf NULL } if (hDC && !ReleaseDC(hWnd,hDC)) // Können wir DC freigeben? { MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); hDC=NULL; // Setze DC auf NULL } if (hWnd && !DestroyWindow(hWnd)) // Können wir das Fenster zerstören? { MessageBox(NULL,"Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); hWnd=NULL; // Setze hWnd auf NULL } if (!UnregisterClass("OpenGL",hInstance)) // Können wir die Klasse de-registrieren? { MessageBox(NULL,"Could Not Unregister Class.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); hInstance=NULL; // Setze hInstance auf NULL } } BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag) { GLuint PixelFormat; // Enthält die Ergebnisse nachdem nach was passendem gesucht wurde WNDCLASS wc; // Fenster Klassen Struktur DWORD dwExStyle; // erweiterter Fenster-Stil DWORD dwStyle; // Fenster-Stil RECT WindowRect; // Enthält die obere linke / untere rechte Eckwerte des Rechtecks WindowRect.left=(long)0; // Setze linken Wert auf 0 WindowRect.right=(long)width; // Setze rechten Wert auf die gewünschte Breite WindowRect.top=(long)0; // Setze den oberen Wert auf 0 WindowRect.bottom=(long)height; // Setze unteren Wert auf die gewünschte Höhe fullscreen=fullscreenflag; // Setze das globale Fullscreen Flag hInstance = GetModuleHandle(NULL); // Ermittle die Instanz für unser Fenster wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // Zeichne neu beim bewegen und eigener DC für's Fenster wc.lpfnWndProc = (WNDPROC) WndProc; // WndProc behandelt die Nachrichten wc.cbClsExtra = 0; // Keine extra Fenster-Daten wc.cbWndExtra = 0; // Keine extra Fenster-Daten wc.hInstance = hInstance; // Setze die Instanz wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); // Lade das Standard-Icon wc.hCursor = LoadCursor(NULL, IDC_ARROW); // Lade den Pfeil-Zeiger wc.hbrBackground = NULL; // es wird kein Hintergrund für GL benötigt wc.lpszMenuName = NULL; // Wir wollen kein Menü wc.lpszClassName = "OpenGL"; // Setze den Klassen-Namen if (!RegisterClass(&wc)) // Versuche die Fenster-Klasse zu registrieren { MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION); return FALSE; // beende und gebe FALSE zurück } if (fullscreen) // Fullscreen Modus? { DEVMODE dmScreenSettings; // Device Modus memset(&dmScreenSettings,0,sizeof(dmScreenSettings)); // Stelle sicher, dass der Speicher geleert ist dmScreenSettings.dmSize=sizeof(dmScreenSettings); // Größe der Devmode Struktur dmScreenSettings.dmPelsWidth = width; // ausgewählte Screen Breite dmScreenSettings.dmPelsHeight = height; // ausgewählte Screen Höhe dmScreenSettings.dmBitsPerPel = bits; // ausgewählte Bits Per Pixel dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT; // Versuche gewählten Modus zu setzen und Ergebnisse zurückliefern. ANMERKUNG: CDS_FULLSCREEN lässt die Start-Leiste nicht anzeigen. if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL) { // Wenn der Modus fehl schlägt, biete zwei Optionen an. Beenden oder im Fenster-Modus laufen lassen. if (MessageBox(NULL,"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?","NeHe GL",MB_YESNO|MB_ICONEXCLAMATION)==IDYES) { fullscreen=FALSE; // wähle Fenster-Modus aus } else { // Message Box anzeigen, die den Benutzer wissen lässt, dass das Programm geschlossen wird. MessageBox(NULL,"Program Will Now Close.","ERROR",MB_OK|MB_ICONSTOP); return FALSE; // beende und gebe FALSE zurück } } } if (fullscreen) // Fullscreen Modus? { dwExStyle=WS_EX_APPWINDOW; // erweiterter Fenster-Stil dwStyle=WS_POPUP; // Fenster-Stil ShowCursor(FALSE); // verstecke Maus-Zeiger } else { dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; // erweiterter Fenster-Stil dwStyle=WS_OVERLAPPEDWINDOW; // Fenster Stil } djustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle); // justiere das Fenster der angeforderten Größe entsprechend if (!(hWnd=CreateWindowEx( dwExStyle, // erweiterter Stil für das Fenster "OpenGL", // Klassen Name title, // Fenster Titel WS_CLIPSIBLINGS | // benötigter Fenster-Stil WS_CLIPCHILDREN | // benötigter Fenster-Stil dwStyle, // ausgewählter Fenster Stil 0, 0, // Fenster Position WindowRect.right-WindowRect.left, // berechne die justierte Fenster-Breite WindowRect.bottom-WindowRect.top, // berechne die justierte Fenster-Höhe NULL, // Kein Parent-Fenster NULL, // Kein Menu hInstance, // Instanz NULL))) // Leite nichts an WM_CREATE weiter { KillGLWindow(); // Resette die Ansicht MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK|MB_ICONEXCLAMATION); return FALSE; // Gebe FALSE zurück } static PIXELFORMATDESCRIPTOR pfd= // pfd teilt Windows mit, wie wie die Dinge haben wollen { sizeof(PIXELFORMATDESCRIPTOR), // Größe des Pixel Format Descriptors 1, // Versions Nummer PFD_DRAW_TO_WINDOW | // Format muss Fenster unterstützen PFD_SUPPORT_OPENGL | // Format muss OpenGL unterstützen PFD_DOUBLEBUFFER, // Muss Double Buffering unterstützen PFD_TYPE_RGBA, // Fordere ein RGBA Format an bits, // wähle unsere Farbtiefe aus 0, 0, 0, 0, 0, 0, // Color Bits werden ignoriert 0, // Kein Alpha Buffer 0, // Shift Bit wird ignoriert 0, // Kein Accumulation Buffer 0, 0, 0, 0, // Accumulation Bits werden ignoriert 16, // 16Bit Z-Buffer (Depth Buffer) 0, // Kein Stencil Buffer 0, // Kein Auxiliary Buffer PFD_MAIN_PLANE, // Haupt-Zeichen-Schicht 0, // Reserviert 0, 0, 0 // Layer Masken werden ignoriert }; if (!(hDC=GetDC(hWnd))) // Haben wir einen Device Kontext erhalten? { KillGLWindow(); // Resette die Anzeige MessageBox(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK|MB_ICONEXCLAMATION); return FALSE; // Gebe FALSE zurück } if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd))) // Hat Windows ein passendes Pixel Format gefunden? { KillGLWindow(); // Resette die Anzeige MessageBox(NULL,"Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION); return FALSE; // Gebe FALSE zurück } if(!SetPixelFormat(hDC,PixelFormat,&pfd)) // Können wir das Pixel Format setzen? { KillGLWindow(); // Resette die Anzeige MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION); return FALSE; // Gebe FALSE zurück } if (!(hRC=wglCreateContext(hDC))) // Können wir einenRendering Kontext kriegen? { KillGLWindow(); // Resette die Anzeige MessageBox(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION); return FALSE; // Gebe FALSE zurück } if(!wglMakeCurrent(hDC,hRC)) // Versuche den Rendering Kontext zu aktivieren { KillGLWindow(); // Resette die Anzeige MessageBox(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION); return FALSE; // Gebe FALSE zurück } ShowWindow(hWnd,SW_SHOW); // Zeige das Fenster SetForegroundWindow(hWnd); // Etwas höhere Priorität SetFocus(hWnd); // Setze den Tastatur-Fokus auf das Fenster ReSizeGLScene(width, height); // Initialisiere unseren perspektivischen GL-Screen if (!InitGL()) // Initialisiere unser neu erzeugtes GL Fenster { KillGLWindow(); // Resette die Anzeige MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION); return FALSE; // Gebe FALSE zurück } return TRUE; // Erfolg } LRESULT CALLBACK WndProc( HWND hWnd, // Handle für dieses Fenster UINT uMsg, // Nachricht für dieses Fenster WPARAM wParam, // Weitere Nachrichten Informationen LPARAM lParam) // Weitere Nachrichten Informationen { switch (uMsg) // Überprüfe auf Fenster-Nachrichten { case WM_ACTIVATE: // Wenn Aktivierungs-Nachricht reinkommt { if (!HIWORD(wParam)) // Überprüfe Minimierungs-Status { active=TRUE; // Programm ist aktiv } else { active=FALSE; // Programm ist nicht länger aktiv } return 0; // Kehre zurück zur Nachrichten-Schleife } case WM_SYSCOMMAND: // hereinkommende System Befehle { switch (wParam) // Überprüfe auf System Aufrufe { case SC_SCREENSAVE: // versucht der Screensaver sich zu starten? case SC_MONITORPOWER: // versucht der Monitor in den Energiesparmodus zu gehen? return 0; // verhindere das } break; // Ende } case WM_CLOSE: // Haben wir eine Nachricht zum Schließen erhalten? { PostQuitMessage(0); // Sende eine Beenden-Nachricht return 0; // Springe zurück } case WM_KEYUP: // Wurde eine Taste losgelassen? { keys[wParam] = FALSE; // Wenn ja, markiere sie mit FALSE return 0; // Springe zurück } case WM_SIZE: // ändere die Größe des Fenster { ReSizeGLScene(LOWORD(lParam),HIWORD(lParam)); // LoWord=Breite, H return 0; // Springe zurück } } // Übergebe alle nicht bearbeiteten Nachrichten an DefWindowProc return DefWindowProc(hWnd,uMsg,wParam,lParam); } int WINAPI WinMain( HINSTANCE hInstance, // Instanz HINSTANCE hPrevInstance, // vorherige Instanz LPSTR lpCmdLine, // Kommandozeilen Parameter int nCmdShow) // Fenster Anzeige Status { MSG msg; // Windows Nachrichten Struktur BOOL done=FALSE; // Bool Variable um die Schleife zu beenden // erzeuge unser OpenGL Fenster if (!CreateGLWindow("NeHe's OpenGL Framework",640,480,16,fullscreen)) { return 0; // Beende, wenn Fenster nicht erzeugt wurde } while(!done) // Schleife die so lange läuft, bis done=TRUE { if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) // Wartet eine Nachricht? { if (msg.message==WM_QUIT) // Haben wir eine Nachricht zum beenden erhalten? { done=TRUE; // Wenn ja done=TRUE } else // Wenn nicht, bearbeite die Fenster-Nachrichten { TranslateMessage(&msg); // Übersetze die Nachricht DispatchMessage(&msg); // bearbeite die Nachricht } } else // Wenn da keine Nachrichten sind { // Zeichne die Szene. Schau nach der ESC-Taste und Beendigungs-Nachrichten von DrawGLScene() if (active) // Programm aktiv? { if (keys[VK_ESCAPE]) // Wurde ESC gedrückt? { done=TRUE; // ESC Signalisiert, dass Beendet werden soll } else // Es ist noch nicht Zeit zum beenden, zeichne Screen neu { DrawGLScene(); // Zeichne die Szene SwapBuffers(hDC); // Swap Buffers (Double Buffering) } } if (keys[VK_F1]) // Wurde F1 gedrückt? { keys[VK_F1]=FALSE; // Wenn ja, setze Taste auf FALSE KillGLWindow(); // Kill unser aktuelles Fenster fullscreen=!fullscreen; // Wechsel zwischen Fullscreen und Fester-Modus // Erzeuge unser OpenGL Fenster erneut if (!CreateGLWindow("NeHe's OpenGL Framework",640,480,16,fullscreen)) { return 0; // Beenden, wenn das Fenster nicht erzeugt wurde } } } } // Shutdown KillGLWindow(); // Kill das Fenster return (msg.wParam); // Beende das Programm } |
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »LittleProgger« (16.08.2010, 16:25)
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »LittleProgger« (16.08.2010, 16:50)
Edit:
Jetzt lese ich immer wieder im Forum "Es wird Opengl 2.0 benötigt", aber wenn Windows doch nur Opengl 1.1 unterstützt
Es gibt kein OpenGL SDK im eigentlichen Sinn. Windows unterstützt direkt nur OpenGL 1.1 auf alles weitere muss unter Windows über Extensions zugegriffen werden.
glaux ist eine total veraltete Utility Library die heute kaum noch irgendwo zu finden ist.
Zitat
NOTE #2: When the first tutorials were written, GLAUX was the way to go. Over time GLAUX lost support. Many of the tutorials on this site still use the old GLAUX code. If your compiler does not support GLAUX or you would rather not use it, download the GLAUX REPLACEMENT CODE from the main page (left menu).
Werbeanzeige