Bücher/Tutorials für Einsteiger zu OpenGL/DirectX (und WinAPI?)
-
Hallo,
nach so einiger Übung in C++ für Konsole möchte ich mich jetzt an GUI- und vor allem Spieleprogrammierung machen.
Mein Problem, für Anfänger habe ich bislang kaum brauchbares Material gefunden. Die meisten Bücher sind auf einem Stand zwischen 2002 und 2004 (auch die hier verlinkten), bauen größtenteils auf C auf und scheinen mir damit insgesamt für einen Einstieg in die Materie als ungeeignet.
An aktuelle Bücher wie das "Red Book" für OpenGL traue ich mich als Anfänger nicht ran, "Spieleprogrammieren für Anfänger/Nix-Wisser/von Null an/ohne Vorwissen etc." erklären größtenteils wieder C++ Basics. Gibt es da nichts dazwischen?
Auch die meistgenannten Tutorials im Internet sind ziemlich veraltet, z.B. basieren die oftgenannten Aufgaben unter http://nehe.gamedev.net/ auf GLaux (und die "neuere" Fassung mit SDL umfasst nur drei Kapitel). Bei Tutorials zu DirectX dreht es sich meist um DirectDraw, das ist auch nicht gerade aktuell...
Mir ist es inzwischen schon völlig egal, ob ich nun bei DirectX oder OpenGL einsteige, auch wenn ich zwischenzeitlich lesen durfte, dass OpenGL auf dem absteigenden Ast sei, da es angeblich (zu) wenig weiterentwickelt würde. Ob das nun stimmt oder nicht (vielleicht kann sich einer der Fachleute dazu äußern?), ich nehme die Umgebung, für die es mehr bzw. bessere/neuere Einsteigerliteratur gibt.
Zur WinAPI habe ich http://win-api.de entdeckt, ich glaube diese Grundkenntnisse reichen aus? Oder gibt es -wenn nötig- auch hier weitergehende Einsteigertexte?
Auf der Suche nach dieser ganzen Literatur bin ich inzwischen am Verzweifeln, da hoffe ich auf einige gute Tipps von euch:
Könnt ihr mir ein paar gute Einstiegstexte nennen? Am liebsten wären mir einige gute Bücher, aber gegen Texte online habe ich natürlich auch nichts einzuwenden.Danke!
-
Hallo,
Zunächst zur WinAPI - die Grundkenntnisse auf der von dir genannten Seite sind für den Einstieg mehr als ausreichend, wenn du mit DirectX arbeitest, musst du per WinAPI eigentlich nur ein Fenster erstellen, mehr nicht. Früher oder später wirst du für bestimmte Zwecke immer wieder auf die WinAPI zurückfallen, aber da ist dann die Referenz auch völlig ausreichend. Die MSDN Library bietet aber auch viel gutes Grundlagenwissen, falls es mal an etwas fehlt.
Gut, zur Einstiegsliteratur. Die Grenzen sind fließend, du wirst, wenn du etwas richtig lernen willst, immer sehr viel redundante Information aufnehmen müssen, um dann das Neue herauszufiltern.
Das ist nicht nur bei Einstiegsliteratur so und völlig normal, dass sich Bücher und andere Texte inhaltlich überschneiden (was meistens auch gut ist, wegen Zusammenhängen untereinander).
Die Aktualität ist besonders bei Einstiegsliteratur zu vernachlässigen, weil es ja nur darum geht, an das Thema herangeführt zu werden. Wenn du nach der Einarbeitung in das Thema ein Projekt startest, solltest du deinen Code in modernem C++ formulieren können, auch wenn das Buch meinetwegen auf C ausgelegt war. Dabei gilt es natürlich zu vermerken, dass man C++ unabhänig behandeln sollte, also ein Buch das C++, DirectX und wohlmöglich noch mehr verspricht, taugt idR sowieso nichts. C++ solltest du auf jeden Fall gelernt und ein Nachschlagewerk in Reichweite haben. Wenn sich das Buch auf eine ältere Version von beispielsweise wieder DirectX stützt, wirst du trotzdem sehr viel nutzen daraus ziehen können, denn viele Grundkonzepte bleiben ja sehr lange unverändert. Und es geht, um es nochmals zu betonen, um Grundlagen. Da sind Details oft unerheblich oder sogar irreführend (für den allerersten Anfang).
Ich will hier nicht ausführen, in welcher Komplexität sich Spieleprogrammierung bewegen kann und nehme an, dass du weißt, was du tust / tun willst. Deshalb rate ich dir zu folgendem:
- Ein eigenes Buch für die benötigte Mathematik, z.B. 3D Math Primer
- Ein Buch um einen Überblick zu DirectX und Technologien zu erhalten, z.B.
3D Spieleprogrammierung mit DirectX und C++
Inside Microsoft DirectX 9-Spieleprogrammierung - Gutes C++ Wissen vorausgesetzt
Natürlich hab ich bei dem Beitrag jetzt vorausgesetzt, dass du in den 3D-Bereich willst. Für 2D wäre OpenGL / DirectX zum Einstieg eher unkonventionell, denke ich.
MfG
-
Hallo,
danke für die rasche und umfangreiche Antwort. Zu zwei Dingen will ich jetzt noch was loswerden:
So gebe ich Dir Recht, dass ein Einsteigerbuch gewisse Redundanzen aufweisen "darf", aber ich stimme Dir auch zu, dass Bücher die C++, DirectX und noch mehr abarbeiten wollen (am besten auf nur 400 Seiten), nicht das Wahre sind. Darauf hat sich mein erster Post auch bezogen, ich möchte halt nicht ein Buch kaufen, das in 400 Seiten DirectX erklärt, wovon dann 200 C++ in Kürze darstellen.
Was die Aktualität angeht, so habe ich da halt schlechte Erfahrungen gemacht. Beispielsweise die besagte Seite zur Winapi. Da wird schön verständlich, Schritt für Schritt vorgegangen und auch detailliert erklärt. Doch gleich beim ersten Programm bricht mein Compiler ab und erklärt mir, dass er char* nicht in LPCWSTR konvertieren kann. So stehe ich als Einsteiger nun da und muss erst einmal entschlüsseln, was denn überhaupt schief gelaufen ist, was denn bitte LPCWSTR ist. Inzwischen weiß ich, dass das irgendeine MS-deklarierter Pointer ist. Aber wie ich nun von const char in diesen Pointer komme oder das Programm so anpasse, dass es meine Angaben auch nimmt, dafür müsste ich mich in der Materie bereits auskennen. Tue ich aber nicht, denn genau deshalb lese ich dieses Tutorial/dieses Buch. Aus dem gleichen Grund sind die nehe-Tutorials zu OpenGL für mich ein Problem, ich müsste den Code auf aktuellen Stand bringen, was ich als Einsteiger aber eben nicht kann. Somit drehe ich mich im Kreis und außer Frust erreiche ich nicht viel.
Google und Co könn(t)en da weiterhelfen, auch dieses Forum hier, aber einerseits müsste ich dazu wissen, was schief läuft und ungefähr auch wie ich es beheben kann, andererseits kann (und will) ich die Leute hier nicht mit permanenten Fragen nerven, die zwangsläufig auf unterstem Anfängerniveau liegen. Mal abgesehen davon, dass die Frage "Was ist LPCWSTR?" wohl auch mit RTFM! beantwortet werden würde...
Die Komplexität von Spielen kann ich mir in etwa vorstellen, vor allem da ich hier in einige Quellcodes von Spielen reingeschaut habe. Aber ich will auch nicht in der nächsten Woche das "MMORPG wie WarCraft" machen. Da reicht die übernächste Woche auch noch gerade aus
Danke für Deine Links, das erste Buch davon habe ich bereits bestellt, weitere werden sicher folgen. Auch möchte ich (natürlich?) in Richtung 3D, werde aber wohl um meine persönliche Interpretation von Tetris nicht herumkommen. Da Du es aber schon ansprichst: Was ist dann eigentlich für 2D besser geeignet? Ich dachte DirectX und Co liefern ebenfalls Möglichkeiten zur komfortablen Erstellung von 2D, als da eben das frühere DirectDraw wären...
-
Naja, das exemplarische Problem mit char* nach LPCWSTR ist jetzt gar nicht mal so auf das etwas ältere Lernmaterial zurückzuführen, sondern vielmehr auf eine IDE, bei der Unicode voreingestellt ist. Das würde ein "moderneres" Tutorial vermutlich auch nicht behandeln.
Für den Fall, dass dieses Problem noch besteht, hier kurz mögliche Lösungen:
1.) Unicode abschalten (Bei Visual Studio: Project Properties -> General -> Character Set auf "Not Set" setzen).
2.) Tatsächlich einen Zeiger auf wchar_t übergeben, indem du dem String ein L voransetzt, etwa so L"Wide String".
3.) Für 2.) gibt es noch ein Makro _T(), das dafür sorgt, dass du Unicode jederzeit an oder abschalten kannst und stets der korrekte String generiert wird.Aber generell hast du natürlich recht, solche Stolpersteine können einen zum Wahnsinn treiben, besonders wenn es so etwas spezielles ist, das nirgendwo erwähnt wird.
Wie einfach 2D mit DirectX ist, weiß ich nicht, weil ich es nie versucht habe. Aber sehr einfach und schnell kannst du Ergebnisse mit SDL, Allegro oder SFML (sehr neu und ziemlich gut!) erzielen.
-
Oh ja, dem Wahnsinn fühle ich mich schon recht nahe nachdem ich nach geschlagenen 3 Stunden endlich das erste Tutorial zum Laufen bekam. LPCWSTR sei dank!
Gelöst habe ich es dann mit LPCWSTR szWitz = A2BSTR(szWitz_char); und dem #include <atlconv.h>
Die Lösung, von Unicode auf keine Vorgabe zu schalten finde ich ..irgendwie.. eleganter
und hab das gleich für Tut2 genommen. Vielen Dank!
Okay, das war dann vielleicht ein anderes Problem, dann könnte ich jetzt natürlich auf die Problematik mit GLaus unter http://nehe.gamedev.net/ verweisen, aber ich denke Du weißt schon was ich meine.
SFML sieht wirklich ganz interessant aus, habe mich da mal schnell und nur zum Überblick durch die Seite und Dokumentation geklickt. Doch auch da würde ich nicht von Null aus starten können, sie schreiben ja selbst, dass sie weder ein Win32 noch eine OpenGL Einführung machen können. Irgendwie wird dem Anfänger der Einstieg in C++ -meiner Meinung nach- viel einfacher gemacht als der Weg danach von Konsole zu Grafik/GUI. Die richtigen Basics werden kaum erklärt und mit den Windows-spezifischen Bezeichnungen krieg ich noch graue Haare.
Jetzt erfreue ich mich noch ein wenig an meinem ersten (leeren) Fenster, ich glaub da mache ich mir gleich einen Screenshot davon zum Ausdrucken.
-
Jetzt noch ein kurzer Nachtrag, bzw. zusätzliche Frage:
Die empfohlenen Bücher beziehen sich auf DirectX, wie sieht es mit Einsteigerbücher für OpenGL aus, gibt es da auch gute (und halbwegs aktuelle) Literatur für den Einstieg?
Danke!
-
Das hier kann ich sehr empfehlen.
http://www.glprogramming.com/red/
-
Irre ich mich, oder verbirgt sich hinter dem Link das "Red Book"?
Dann kann ich das nämlich erst gemütlich ansehen und entscheiden, ob das für Einsteiger geeignet ist, bevor ich die neueste Fassung kaufe...