in den letzten Wochen wird hier ständig von OpenGL 3 geschrieben. Kann mir jemand kurz erläutern, was das genau ist bzw was der Unterschied zum bisherigen ist? Was fällt weg bzw soll man zukünftig nicht mehr benutzen?
Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
Mit der Version 3 wurde OpenGL vor allen erst einmal ordentlich aufgerauemt und eine neue Architektur eingefuehrt. Dadurch wurden eine ganze Ecke an Funktionen rausgeschmissen und das Ganze Rueckt ein wenig naeher an DX. Spaeter kamen dann noch einige neue GPU Features wie etwa Geometry Shader und OpenCL Support.
Wegefallen sind vor allen Dingen solche Sachen wie zum Beispiel glBegin/glEnd die eh schon keine grosse Bedeutung mehr hatten.
Mit der Version 3 wurde OpenGL vor allen erst einmal ordentlich aufgerauemt und eine neue Architektur eingefuehrt. Dadurch wurden eine ganze Ecke an Funktionen rausgeschmissen und das Ganze Rueckt ein wenig naeher an DX. Spaeter kamen dann noch einige neue GPU Features wie etwa Geometry Shader und OpenCL Support
Ich suche aber irgendwie eine praktischere/ konkretere Antwort (oder ein Hinweis auf einen erklärenden Artikel o.ä. ). Was muss ich ändern, um von der alten Programmierweise (siehe Foren-Tutorials) zu dem OpenGL-3-Style zu kommen?
Zitat:
Wegefallen sind vor allen Dingen solche Sachen wie zum Beispiel glBegin/glEnd
Das ist ja das, was mich verwirrt. "glBegin/glEnd" funktioniert ja noch.
Wo liegt der praktische Unterschied?
p.s.: ich gehe mal davon aus, dass das bestimmt auch andere interessiert. hoffe ich.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Um OpenGL3 zu nutzen, musst du einen speziellen Kontext anfordern. Will heißen, wenn du nichts besonderes gemacht hast, dann bekommst du nur einen OpenGL2 Kontext.
Dann gibt es OpenGL3 in Forward-Compatible (ohne glBegin/glEnd et. al.) und in Backward-Compatible (mit diesen). Dass du die trotzdem noch nutzen kannst, hängt also vermutlich damit zusammen, dass du keinen OpenGL3 Kontext bzw. keinen Forward-Compatible OpenGL3-Kontext hast.
grüße
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
in den letzten Wochen wird hier ständig von OpenGL 3 geschrieben.
Das liegt hauptsächlich an glAwesome und mir, denke ich. Es sind hier auch noch einige ältere OpenGL-Entwickler unterwegs und das Wiki ist auch fast ausnahmelos noch nicht auf OpenGL-3-Stand.
Zitat:
das Ganze Rueckt ein wenig naeher an DX.
Das stimmt schon. Allerdings nicht im negativen Aspekt wie man betonen muss. Wenn das Wort "DirectX" fällt, sind einige OpenGL "Fanatiker" möglicherweise abgeschreckt.
Zitat:
Ich suche aber irgendwie eine praktischere/ konkretere Antwort
Die konkrete Antwort ist, dass der Immediate Mode und die fixed Pipeline weggefallen sind. Früher haben die Grafikkarten/Treiber die fixed Pipeline direkt in Hardware umgesetzt. Da gab es also auf der Grafikkarte ein Hardwaremodul für Lichter, eines für Multitexturing und so weiter. Irgendwann hat man aber festgestellt das Anzahl OpenGL-Einstellungen dadurch unglaublich groß ist. Man siehe zb. der Auswahl an Multitexturingmöglichkeiten. Trotzdem waren viele Dinge wie Normalmapping damit erstmal nicht möglich. Deshalb hat man das mit OpenGL 2.0 Shader eingeführt. Im Laufe der Zeit hat sich die Hardware so verändert, dass auch alle fixed Funktionen intern im Treiber mit Shadern umgesetzt werden. Parallel spezialisierte fixed-Hardware und Shader parallel auf der Grafikkarte ist ja natürlich eigentlich redundant und damit überflüssig. Allerdings bremst es das Programm aus und verkompliziert gleichzeitig enorm die Treiberentwicklung wenn intern der unglaubliche Wildwuchs an fixed Funktionen in Shadern übersetzt werden müssen. Deshalb hat man in OpenGL 3.0 viele Funktionen als "deprecated" deklariert und mit OpenGL 3.1 entfernt. Der Immediate Mode wurde im Prinzip aus den gleichen Gründen entfernt: Er ist so langsam durch Treiberoverhead das man ihn eh nicht mehr verwenden sollte und er verkompliziert die Treiber enorm. Deshalb ist auch er geflogen. Die API ist alle allgemeiner geworden. Langsame veraltete Techniken sind rausgeflogen. Die API wurde einfacher. Viele moderne OpenGL Features zielen mehr oder weniger nur darauf ab, einfach die Anzahl OpenGL-Aufrufe zu reduzieren. Da ist der Immediate Mode natürlich Gift.
Zitat:
Was muss ich ändern, um von der alten Programmierweise (siehe Foren-Tutorials) zu dem OpenGL-3-Style zu kommen?
Veraltete Funktionen rauswerfen und konsequent auf OpenGL 3.3+ Core-Features aufbauen. Tutorials zu OpenGL 3 gibt es genug:
Das ist ja das, was mich verwirrt. "glBegin/glEnd" funktioniert ja noch.
Jaein. Der Punkt ist, wenn man die gesamte Prä-OpenGL-3-Ära einfach aus den OpenGL Treibern entfernt hätte, würde kein altes Programm mehr nach einen Treiberupdate laufen. Deshalb gibt es zwei OpenGL Profile. Zum einen das "Core"-Profil, dass alle echten Features von OpenGL beschreibt und zum Anderen das "Compatibility"-Profil, unter welchen auch veraltete Funktionalität noch zugreifbar ist. Das "Compatibility"-Profil ist ohne Zutun erstmal automatisch aktiv, klar, sonst würde alte Software ja auch nicht mehr laufen, weil die Programmierer natürlich nicht das Profil aktivieren konnten, das es damals noch gar nicht gab. Das OpenGL "Compatibility"-Profil wird jedoch nicht mehr durch die eigentliche OpenGL Spezifikation beschrieben und ist nur eine Extension (ARB_compatibility).
Für den Umstieg gibt es mehrere Gründe. Zum Beispiel:
Zukunftssicherheit. Irgendwann werden die Treiberentwickler die Unterstützung von ARB_compatibility beenden. Dann bleiben höchstens noch irgendwelche komische Wrapper etc. um Software zum Laufen zu bekommen.
Performance. Die Funktionen wie der Immediate Mode werden ja schon länger nicht mehr empfohlen und waren technisch bedingt noch nie so Schnell wie die Alternativen. In Zukunft wird der Fokus der Treiberentwickler hier noch weniger liegen.
Zukünftige Features werden nicht für "ARB_compatibility" ausgelegt sein.
Es ist also keine gute Idee die Entwicklung zu ignorieren. Es ist eine gute Idee einen "Core"-Context zu erzeugen und dann entsprechend eine Exception zu bekommen, wenn man versehentlich versucht noch auf alte Funktionalitäten zuzugreifen. Wie du ja auch schon festgestellt hast, bekommt man das sonst nämlich erstmal gar nicht mit.
EDIT: Auch wenn es ja sonst im Wiki wie anfangs schon gesagt leider sehr mager mit OpenGL 3 aussieht, gibt es schon eine Liste, der noch verfügbaren Funktionen: [url]http://wiki.delphigl.com/index.php/OpenGL3-Funktionsübersicht[/url]
Das liegt hauptsächlich an glAwesome und mir, denke ich.
Ja, richtig. Es ist ja gut sowas anzusprechen.
Zitat:
Es sind hier auch noch einige ältere OpenGL-Entwickler unterwegs
Ja, ist nur die Frage, was Du mit "ältere" meinst?
Zitat:
Veraltete Funktionen rauswerfen und konsequent auf OpenGL 3.3+ Core-Features aufbauen.
Die Tuts habe ich schon mal so überflogen. Für mich gab sich daraus, dass in der Hauptsache VBOs und Shader genutzt werden anstatt glBegin/glEnd. Sehe ich das richtig?
Ich habe aber noch keine -für mich verständliche Abhandlung- gefunden, die mir sagt, was veraltet und was neu ist. (Du hast da gerade ein Edit drin, guck ich mir gleich an)
Im Prinzip beschreibt es zu 98% aller Dinge die Beiden Worte "Immediate Mode" und "fixed Pipeline". Statt desen sollte man halt Vertexbuffer und Shader einsetzen. Aber Achtung: Auch bei Shadern muss man wieder vorsichtig sein, denn, wie schon geschrieben, gibt es die seit 2.0. Es gibt also auch prä-3-Shader. Deshalb am Anfang "#version 330" setzen und nicht veraltete Schlüsselwörter wie "varying" einsetzen, dann hat man "echte" OpenGL 3.3 Shader. Aber Achtung mit der Liste! Einige Dinge sind nicht direkt ersichtlich. Weggefallen sind zum Beispiel auch viele spezielle Texturmodes für bestimmte Farbkannäle. Eine relativ moderne sichere Quelle sind Tutorials mit expliziter 3.3 Kennzeichnung, OpenGL.org und der Standard. Zu Texturen zum Beispiel der Standard: http://www.opengl.org/sdk/docs/man/xhtml/glTexImage2D.xml Für "Alphatexturen" beispielsweise passt man entweder den Shader selbst an oder ändert die Swizzle-Einstellungen.
Zitat:
Alles was nicht in der List steht, muss ich aus meinem Code rauswerfen und anders lösen.
Damit man nicht in Versuchung kommt, aus Schlamperei, Unwissen oder was auch immer: Besser einen "Core"-Profil Context erstellen. Ich wäre sonst zum Beispiel nie darauf gekommen, dass "glGetString(GL_EXTENSIONS)" veraltet ist.
Damit man nicht in Versuchung kommt, aus Schlamperei, Unwissen oder was auch immer: Besser einen "Core"-Profil Context erstellen.
Okay, da steht aber noch meine Frage offen, wie man das konkret macht. Gibt es bei dem dglOpenGl-Header einen Kniff?
Mit dem direkten Umschalten bei laufenden Projekten ist das immer etwas schwierig. Erst einmal muß man möglichst viel während der vollen Fahrt umstellen und dann den Context umstellen. Sonst läuft wahrscheinlich gar nichts mehr.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
OpenglerF hat geschrieben:
Es sind hier auch noch einige ältere OpenGL-Entwickler unterwegs und das Wiki ist auch fast ausnahmelos noch nicht auf OpenGL-3-Stand.
*hust* Du hast bearbeiten-rechte für’s wiki. Feel free to upgrade!
grüße, Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Bei delphispezifischen Sachen kann ich dir leider nicht weiterhelfen. Ich verwende GLFW3 in C++. Da gibt es einen Wert in der Initialisierungsstruktur den man setzen muss.
Natürlich muss man erstmal nach und nach migrieren, aber dann sollte man schon auch umstellen und nicht auf halben Weg aufgeben.
Zuletzt geändert von OpenglerF am Do Jan 16, 2014 16:07, insgesamt 1-mal geändert.
Zu OpenGL3 allgemein hat mathias in letzter Zeit 'ne Menge Fragen gestellt. Falls du das nicht sowieso schon gelesen hast, lohnt sich vielleicht auch ein wenig Stöberei. Was sich in der Shadersprache GLSL (die man in OpenGL3 zwangsweise benutzen muss) im Wesentlichen geändert hat, habe ich hier aufgelistet.
Lord Horazont hat Recht. Vom schlecht reden wird das Wiki natürlich nicht besser. Ich würde mich auch freuen, wenn mehr Leute mitarbeiten würden. (Was jetzt nicht auf eine bestimmte Person bezogen ist.)
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Wollte ich auch garnicht angedeutet haben . Ich wollte nur darauf hinweisen, dass jeder hier nach kurzer Zeit Wikibearbeitrechte bekommt und keiner sich scheuen soll, daran mitzuwirken.
grüße
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.