(Anfänger) Qt mit und ohne SDL, OGL Fragen, OGL initialisierung, raytracing
-
Hallo
Ich versuche momentan mein einstieg in OGL zu finden. SDL+OGL+MAC OS installiert. Soweit so gut. Kann schon ein Quadrat auf dem bildschirm zeichen

Kämpfe aber noch mit dem Buch "jetzt lerne ich OpenGL" von M+T bis mein neues buch kommt. Habe mir schon, so einige Bücher angeguckt und da ich MS abgrundtief hasse, finde ich, dass viele Autoren zu dumm sind um mfc nicht zu benutzen und damit die Platformunabhängigkeit zu bewahren. Das finde ich sowas von zum kotzen, und es zeigt auch wieso ich MS hasse. bäääääh
Okay nun zu meinen Fragen:
1. Ich frage mich momentan warum man bei QT so viel Geld für die OGL Lizens auf den tischen legen muss wenn man SDL damit verbinden kann, oder gar mit Java. Wo ist da der unterschied Zwischen QT+SDL oder die OGL-Qt-Version? gibts da bestimmte Vorteile?
2. Also in den paar Büchern die ich bis jetzt gesehen habe, wird einfach los gelegt: Das setzt die aktuelle Matrix, das die Perspektive, Clipebene usw. danach folgt eine Erklärung dafür, sei es auf englisch oder auf deutsch. Und was steht da? einfach noch mal das gleiche! Toll, wow, und das sind bücher für Einsteiger. Hab paar Funktionen in der OGL-Referenz nachgeschaut, bin aber auch nicht schlau daraus geworden

Also wer kann mir bitte sagen wo ich vernüftige Erklärung zu den Initialisierungs Funktionen finden kann? Solche wie: glMatrixMode(GL_PROJECTION),glMatrixMode(GL_MODELVIEW), glOrtho(),glViewport(), glLoadIdentity(), glClear() usw?
Ich will nicht einfach stumpf drauf los schreiben ohne die Sachen gründlich zu verstehen

3. Also zu wissen dass bei glVertex3d ein Punkt gezeichnet wird, ist ja toll un schön aber ich will einfach für Verständnis mehr Hintergrundwissen haben, wie: wie kommt es dahin? wie arbeitet die Grafikkarte? wann wird die GPU wann die CPU genutzt, usw... Kenn jemand ein gutes Material zu dem Thema?
4. Vor paar Tagen, dachte ich ich weiß was eine 3DEngine ist aber nun bin ich am zweifeln
Ist OpenGL letztendlich auch eine Engine? Wenn man eine Engine schreibt, verwendet man da z.B. die OGL-Funktionen oder schreibt man alle neu?5. Okay das muss ich zwar nicht sofort wissen aber wenn ich schon dabei bin:
Da ich das alles für die Uni und für mich tue, und da wir auf jeden Fall in Zukunft grundlegende Sachen zu raytracing machen werden, wollte ich Fragen wo ich anständiges Online-Material darüber finden kann?wer nicht faul war um disen ganzen Text zu lesen und vielleicht sogar noch eine Antwort darauf zu geben: DANKE im voraus!!!

mfg Sidex
-
Zu Qt kann ich leider nichts sagen...
2. Ja, hinter OpenGL steckt sehr viel Mathematik dahinter. Wissen über Matrizen und Vektoren sowie eine gewisse Ahnung von Quaternione gehören dazu. Aber das ist m. M. noch vertretbar.
In OpenGL hast du 3 Matrizen. Projection, Modelview und Texture. Für jede Matrix gibt es Matrixoperationen wie glLoadIdentity(Einheitsmatrix), glScale(Skalierungsmatrix), glTransform(Verschiebungsmatrix), glRotate(um einen Winkel mit angegebener Drehachse(hier kommt das Wissen über Quaternione zum Einsatz)), glLoadMatrix(Matrix aus dem Speicher laden) usw.
Zu jeder Matrix gibt es wiederum einen Matrixstapel. Auf denen kannst du Matrizen ablegen und wieder herunternehmen.
Zu den 3 Matrizen: Projectionmatrix bestimmt die Darstellung. Man kann eine Perspektivische Matrix angeben über gluPerspective(generiert die eine entsprechende Matrix) oder orthogonale Matrix(wie man es von 3D Editoren her kennt in der Top-, Back- und Frontansicht). In ihr wird auch der Sichtwinkel angegeben.
Modelviewmatrix ist zum Transformieren von Objekten in der Szene da. Mit ihr gibst du die Position, Rotation und Skalierung deiner Meshs/Objekte an. Du setzt die aktuelle Transformation für ein Objekt, renderst es, und dann setzt du sie für ein anderes Objekt und renderst es usw.
Texturematrix ist zum Transformieren von Texturen da. Sie wird mit den STUV(S = horizontal, T = vertikal, U = Tiefe(für 3D Tetxuren), V = 1.0 = normailisert) Texturekoordinaten Koordinaten verrechnet. Damit kannst du die Textur auf dem Objekt vershcieben. Später kannst du damit die Textur projektieren(Batmaneffekt oder auch projektierter Schatten).
Weiterhin musst du wissen, dass es mehrere Buffer gibt. Der Fragmentbuffer/Colorbuffer ist der Buffer, den du auf dem Bildschirm siehst. Im normalfall baust du die Szene im Backbuffer auf und wenn alles fertig gerendert ist, wird der Backbuffer in den Frontbuffer kopiert. Frontbuffer = was du auf dem Bildschirm siehst.
Der Depthbuffer oder auch ZBuffer genannt enthält tiefen Informationen der Fragmente(= Pixel, die vom Objekt gerendert wurden). Wurde ein Fragment beispielsweise an Windows\Z = 0.5 gerendert und dann kommt ein Fragment an Windows\Z = 0.3 so wird dass mit 0.3 nicht gerendert, weil es von 0.5 verdeckt wird.
Mit Stencilbuffer und Accumulatorbuffer wirst du dich dann später beschäftigen. Das sind Techniken, die du vorerst als Anfänger nicht benötigst. Sie dienen über Schattenvolumen und "Aftereffects".
Joar, und mit glClear kannst du diese Buffer wieder löschen besser gesagt, überschreiben. Wenn vom letzten frame noch dein Charackter an X = 10 zu sehen war, und im jetzigen an X = 12, dann würdest du ohne glClear 2 Charaktäre auf dem Bildschirm sehen. Mit glClear(GL_COLOR_BUFFER_BIT) überschriebst du aber den Fragmentbuffer mit einer ausgewählten Farbe. Es wird nur noch 1 Charakter gezeichnet.
3. Hierfür sind die Specs essentiell. Die Koordinaten, die du mit glVertex3f bestimmst, werden mit der Modelview und Projectionmatrix multipliziert. Dann in Devicekoordinaten und in ein homogenes Koordinatensystem gebracht und zum Schluss mit der Viewportmatrix multipliziert. Das ist aber recht schwierig zu verstehen(habe schon einiges an Zeit gebraucht, um einen Softwarerenderer daraus zu basteln). Sollte für dich zu Anfang aber auch unwichtig sein.
4. OpenGL ist eine standardisierte Grafikschnittstelle. d.H. der Grafikartentreiber muss die Funktionen wie glVertex3f zu Verfügung und entsprechend für die Grafikkarte aufbereiten. Wie die letztlich zur grafikkarte geschickt werden, hängt vom Hersteller ab. OpenGL sagt also den Herstellern, dass ihre Treiber glVertex3f bereitstellen müssen. Wie sie das tun, ist denen überlassen.
5. http://wiki.delphigl.com/index.php/Tutorial#Raytracing
Allgemein: http://wiki.delphigl.com/index.php/Tutorial#Einsteiger-Tutorials
Es gibt keine gravierenden Unterschiede, wie OpenGL nun angesteuert wird. Ob nun in Delphi oder C++, ist egal. Deswegen kannst du das Tutorial ohne Probleme nutzen. Mit NeHe tue ich mich übrigens immer schwer. Ich pers. finde es nicht sehr hilfreich, aber da sind andere anderer Meinung.mfg olli
-
hm... mal ein bisschen antwort.
1. Ich frage mich momentan warum man bei QT so viel Geld für die OGL Lizens auf den tischen legen muss wenn man SDL damit verbinden kann, oder gar mit Java. Wo ist da der unterschied Zwischen QT+SDL oder die OGL-Qt-Version? gibts da bestimmte Vorteile?
also so weit ich weiß ist QT kostenlos, solange du die Programm die du damit entwickelst unter die GPL stellst. Und ich hab auch noch nichts von einer SDL-QT-Lizenz gehört, oder OGL-QT. Das sind nämlich verschiedene Sachen. QT ist ein crossplattform-GUI-(und ncoh vieles mehr)-Framework, OpenGL ist eine SPezifikation wie man mti der Grafikkarte dinge malen kann und so und SDL (also der Grafikteil) ist meines wissens nach eine Art wrapper um OpenGL für 2D-Projekte.
Also wer kann mir bitte sagen wo ich vernüftige Erklärung zu den Initialisierungs Funktionen finden kann? Solche wie: glMatrixMode(GL_PROJECTION),glMatrixMode(GL_MODELVIEW), glOrtho(),glViewport(), glLoadIdentity(), glClear() usw?
Lies dir Infos zum Renderpass durch, besonders was die Matrizen angeht. Grob gibt es drei Matrizen: Die Weltmatrix, die sichtmatrix und die projektionsmatrix.
Stell es dir so vor:
Du bist ein Mensch der in einer 3D-Welt rumrennt. Deine Augen sind sozusagen die deine Kamera, das ist die Sichtmatrix. Sie transformiert die Objekte ind er Welt so, dass du sie siehst. Wenn du dich drehst, drehen sich ja nciht die Objekte, sondern nur deine Sicht dreht sich. DAs macht die Sichtmatrix/Kameramatrix. IS das gleiche. penGL-Pendant dazu ist... öhm... weiß ich jetzt nicht.
Die Weltmatrix verschiebt (und noch andere transformationen) Objekte in der welt hin und her. Damit kannst du zum Beispiel sagen, dass eine Blume vor einem Haus steht, obwohl beide im Modeleditor am Koordinatenurpsrung erstellt wurden. Sie transformiert lokale koordinaten in globale. OpenGL müsste GL_MODELVIEW sein.Zum Schluss gibt es noch die Projektionsmatrix. Die berechnet dann sozusagen, wie das Bild, das die Kamera (deine augen in der virtuellen welt) einfängt, auf den Bildschirm projeziert werden muss, damit es echt aussieht. Du kannst damit zB einstellen wie breit der SichtWinkel deiner Kamera ist und so. GL_PROJECTION ist dafür zuständig, is ja klar.
Mit den MAtrixfuntkionen wie LoadIdentity usw. wird immer die aktuelle Matrix mit der Matrix multipliziert, die die Funktion liefert. Durch Matrixmultiplikationen kann man mehrere Transformationen in eine MAtrix packen.
glLoadIDentity() erstellt eine MAtrix, die keinerlei Transformationen durchführt.Die anderen Funktionen üprobierst du am besten selber aus was sie machen, ist sowieso eine gute idee. Man bekommt dann schneller mit was wie passiert und wenns wirklich noch wo hakt kann man ja noch mal fragen.
3. Also zu wissen dass bei glVertex3d ein Punkt gezeichnet wird, ist ja toll un schön aber ich will einfach für Verständnis mehr Hintergrundwissen haben, wie: wie kommt es dahin? wie arbeitet die Grafikkarte? wann wird die GPU wann die CPU genutzt, usw... Kenn jemand ein gutes Material zu dem Thema?
kA... also OpenGL spricht den GraKa-Treiber an und der die hardware deiner GraKa. Allgemein kann man sagen, dass die Funktionen von OpenGL meist auf der GraKa ausgeführt werden. Ausnamhen sind funktionen die Geometrie erzeugen wie gluCylinder oder so.
4. Vor paar Tagen, dachte ich ich weiß was eine 3DEngine ist aber nun bin ich am zweifeln
Ist OpenGL letztendlich auch eine Engine? Wenn man eine Engine schreibt, verwendet man da z.B. die OGL-Funktionen oder schreibt man alle neu?OpenGL ist ein API (Application programming interface). Irrlicht, Ogre3D, crystalSpace usw. sind engines. guck wikipedia
So... hoff hab erstmal ein bisschn was geklärt.
-
also erst mal vielen vielen dank euch beiden, es hat mir schon viel geholfen.
werde mir die oben stehenden tutorials auch angucken und durchlesen.
was sdl und qt angeht, da hab ich mich vielleicht etwas falsch ausgedrückt.
das mit gpl usw. ist mir klar. was ich wissen will, ist etwas anderes.also es gibt ja bei qt diesen openGL wighet, ne? auf der anderen seite kann man doch qt mit sdl verbinden und kann somit auch openGl programmieren. also gibts da bestimmte vorteile, ob ich den qt-wighet verwende oder qt mit sdl verbinde oder sdl slleine verwende? performance? irgendwelche besondere funktionen die man sonst nicht hat? oder was anderes?
danke im voraus.