Registriert: Do Jul 23, 2009 04:33 Beiträge: 157
Programmiersprache: Turbo Delphi Pro
Ahoi Also, mein Spiel besteht bisher aus einem Quadrate-Raster (sagen wir 100x100). Auf diese Quadrate habe ich texturen gepappt... Gras, Wasser, Wüste... Felder, Fels etc. werden noch folgen. Das ganze hatte ich schonmal mit den Standard zeichenfunktionen von Delphi bzw. Windows umgesetzt und jetzt auf OpenGL übertragen, soweit so gut.
Jetzt habe ich das Problem, dass ich einen weiteren "Layer" darüber legen muss... also z.B. Schienen, Straßen etc. Diese Texturen werden transparente Bereiche enthalten, so dass z.B. bei einer Schienenkurve das grüne Gras von unten Durchschienen soll. Die Texturen liegen bereits im TARGA Format vor, laden klappt auch schon, mit Bleding habe ich bereits experimentiert. Aber ich weiß noch nicht wie ich es am besten realisier dass eben beide Texturen übereinander kommen... wohl habe ich von Multitexturing gelesen, aber das scheint ja nicht auf allen GraKas zu gehen, vielleicht gibt es bessere Methoden?
Was mir so einfiel bisher:
- Multitexturing eben
- Ich könnte auch einen 3D-Damm für die Schienen und Straßen bauen, so dass über den Quads ein leicht erhöhtes Quad liegt welches die Textur enthält... wäre vermutlich das einfachste... aber nicht unbedingt das schönste...
- Evtl könnte man intern jeweils aus zwei Ausgangstexturen eine dritte Textur generieren (tBitmap) und diese verwenden... könnten aber mitunter sehr viele Texturen werden
Weiteres Problem: bisher ist mein Untegrund als Display-Liste organisiert. Wenn der Spieler später Straßen und SChienen bauen können soll, müsste dabei die Liste jeweils neu erzeugt werden, wenn ich nicht Methoden wie die mit dem "Damm" verwende... oder hat da jemand ne gute Idee wie man das realisieren könnte?
Anbei ein Screenshot aus meinem alten 2D-Programm
P.S. es soll eine 3D-Anwendung werden... ich kann also nicht glOrtho + Z-Sortierung verwenden (nur mit dem Umweg des "Bahndamms")
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen. (Koreanisches Sprichwort)
P.S. es soll eine 3D-Anwendung werden... ich kann also nicht glOrtho + Z-Sortierung verwenden (nur mit dem Umweg des "Bahndamms")
Du kannst mit glDisable(GL_DEPTH_TEST) den Z-Buffer abschalten. (*) Dann kannst du die bereits gezeichneten Pixel vom Untergrund mit deinen Straßen oder Schienen übermalen. Ein erhöhter Bahndamm oder ähnliches ist dann nicht erforderlich.
Ein derartiges Überzeichnen sollte hier der einfachste Weg sein. Auch wenn Multitexturing mittlerweile echt auf jeder Grafikkarte gehen sollte, es ist zu unflexibel, wenn du Displaylisten verwenden willst.
(*) glDepthMask ist in diesem Zusammenhang vielleicht ebenfalls ganz nützlich.
Ich weiß nicht wie weit dein Spiel "3D" werden soll, aber wenn die Landschaft Hügel hat und man sehr flach über sie hinweg schauen kann, würde der 2te Layer auch durch die Berge sichtbar sein. Das kann man vielleicht verhindern wenn man statt den Tiefentest auszuschalten mit glDepthFunc den Tiefentest auf GL_EQUAL stellt. Das normale Terrain würde den Tiefenbuffer initialiseren und die Schienen u.ä. könnten nur auf dem am nächsten zum Betrachter liegenden Pixel gezeichnet werden. Das funktioniert natürlich nur wenn die Quads für den 2ten Layer genau gleich denen aus dem ersten sind.
Achso, zu dem mit den Displaylisten und dem Schienen hinzufügen. Mir fallen da jetzt 2 Möglichkeiten ein. Entweder man erstellt die Displayliste immer neu oder man erstellt zusätzliche mit den Änderungen. Beides ist aber reichlich suboptimal, wie du sicherlich auch schon gemerkt hast. Displaylisten zu verändern, geht meines Wissens nicht.
Dann gibt es noch ein paar andere Möglichkeiten:
Zum einem Shader. Welche Textur auf welchem Quad ist wird in einer Textur gespeichert, die quasi einem Integer enthält mit dem aus einem Texturatlas die entgültige Textur rausgesucht wird. Die Textur kann man dann auch punktuell ändern.
Dann gibt es VBOs: Die kann man auch ändern und so die Texturkoordinaten auf die richtige Stelle im Texturatlas einstellen.
Und die letzte Möglichkeit die mir einfällt ist: Man zeichnet alles mit dem Immediate Modus. Wenn man nur die sichtbaren Quads zeichnet, sind die Daten die jedesmal über den Bus gehen müssen auch relativ gering (sofern man nicht allzuweit rauszoomen kann).
Die ersten beiden sind wahrscheinlich am geschicktesten, allerdings auch aufwendiger und vielleicht nicht so für das "Einsteiger"-Forum geeignet.
Also wenn Multitexturing schon Bauchschmerzen wegen Kompatibilität macht, fallen Shader ja wohl flach.
Immediate Mode kommt auch nicht in Frage - das wäre noch langsamer, als wenn er für jedes Frame eine neue
Displayliste erstellen würde. Das Problem an Immediate Mode ist primär NICHT, dass die Daten über den Bus
müssen - sondern das der Treiber absolut keine Ahnung hat, was der Benutzer tut oder tun will. Und das jedes
Frame. Kein Chaching, keine Geometrieoptimierung, kein Prefetching, es geht Leistung für eine Menge
Fehlerkontrolle drauf usw. usf..
VBOs benötigen auch meines Wissens mindestens OpenGL 1.5 - und sind damit wesentlich anspruchsvoller als
Multitexturing.
Was dir also bleiben würde, Tilman, wären Vertex Arrays im Hauptspeicher. Diese sind ab OpenGL 1.2
zu haben und eignen sich recht gut für stark veränderliche Geometrie, da man im Hauptspeicher schnell mit
der CPU lesen und schreiben kann, sind aber natürlich beim Zeichnen langsamer als Lösungen die VRAM-Basiert
sind (wie Displaylisten und VBOs) - das sollte aber bei einer 2 oder 2,5D (?)-Anwendung mit "einer Hand voll"
Vertices kaum eine Rolle spielen.
D.h. belasse auf jeden Fall alles, was statisch ist, in einer Displayliste - und zeichne deine Straßen usw. mit einem
Vertexarray darüber.
Zitat:
Evtl könnte man intern jeweils aus zwei Ausgangstexturen eine dritte Textur generieren (tBitmap) und diese verwenden... könnten aber mitunter sehr viele Texturen werden
Mach das nicht. Man kann selbst auf sehr alter Hardware vergleichsweise schnell Texturen übereinanderblenden - wenn
der Speicher aber knapp wird, und das würde er mit dieser Methode ziemlich sicher, ist nichts mehr zu holen. Auch
würdest du mit dieser Methode ziemlich viel CPU-Leistung verbraten (es sei denn, du machst es auf der Grafikkarte
via Render-to-Texture... mit den gewünschten Hardwareanforderungen würde der Flaschenhals dann aber
glCopy(Sub)TexImage2D in Verbindung mit glReadPixels werden.
Zuletzt geändert von waran am Fr Aug 14, 2009 09:49, insgesamt 1-mal geändert.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also ich würde mal behaupten VBOs sollten heutzutage echt kein Problem mehr darstellen. Selbst meine uralte Elsa Erazor III (TNT2) (kein Speicher für Vertexdaten) konnte VBOs. Allerdings hat der Treiber die via VertexArrays emuliert. Was aber im Endeffekt nicht langsamer als VertexArrays ist und dem Entwickler etwas Arbeit erspart. VBOs befinden sich im Kern von OpenGL 1.5. Allerdings dem Kern liegt eine eigenständige Erweiterung zugrunde und die kann auch mit früheren Versionen unterstützt werden. Zum Thema Multitexturing. Die Grafikkarte von Elsa konnte bereits 2 Texturen gleichzeit auf einem Primitiv darstellen und diese Karte ist mittlerweile ziemlich genau 10 Jahre alt. Ich denke das sagt genug aus, oder?
Tilman: Was die Hardwareanforderung angeht. Du solltest dir überlegen was du mit deiner Anwendung erreichen möchtest. Also wenn du so etwas wie Licht und Schatten haben willst, dann ist das eine Anforderung. Und je nachdem ergibt sich die Mindestanforderung der Hardware fast von alleine. Wenn dir die Anforderungen zu hoch erscheinen oder sich zu viele Leute beschweren, weil es nicht läuft, dann kann man immer noch überlegen ob man nicht noch einen Pfad einbaut der auf das ein oder andere Feature verzichtet. Von Anfang an so kompatibel wie möglich bleiben zu wollen ist nicht sonderlich sinnvoll. Entweder du musst dann massiv mit optischen einbußen leben oder du programmierst dich tot. Da ist es einfacher erst mal eine moderate Anforderung zu stellen. Denn bedenke. Die Radoen 9X00 sind mittlerweile auch schon wieder 6 Jahre alt. Und die können OpenGL 2.0 inklusive glSlang und im Shader sogar bis zu 8 oder 16 Texturen. Windows Vista mit Aero benötigt mindestens solch ein Kaliber. Also ist wahrscheinlich OpenGL 2.0 locker als Mindestanforderung machbar.
Zum Thema Gleise und Strassen. Ist natürlich die Frage was du da genau vor hast. Da du es eh als 3D machen wolltest warum nicht gleich ganz 3D? Deine Welt ist bereits in Qudrate zerlegt. Du müsstest jetzt "nur" in einem 3D Programm Schienen, Strassen, Brücken desigen. Also, dass du die einzelnen Quads als eine Art Model vorbereitest und dann daraus deine Welt zusammensetzt. Für Schienen bräuchstest du eine Gerade, Linkskurve, Rechtskurve und je nachdem noch Weichen. Bei Weichen wäre es wohl auch einfacher, wenn von einer Schiene eine weitere abgeht und die ursprüngliche unverändert gerade weiterläuft. Nicht wie auf deinem Bild. Das wäre einfacher zum Zusammenbasten. Bei Strassen benötigst du in etwa das Selbe. Denn wenn du 3D haben willst aber nur flache Texturen benutzt dann könnts gut sein, dass der Effekt dich früher oder später nicht glücklich machen wird.
Registriert: Do Jul 23, 2009 04:33 Beiträge: 157
Programmiersprache: Turbo Delphi Pro
Hallo erstmal an alle und vielen Dank!
Also zum Thema Anforderungen: ich bin halt Anfänger, und so ein bisschen Angst machen mir immer Angaben vor jedem Artikel das dieser und jener Befehl nicht auf jeder Karte funzt... daher war mein Ziel erstmal möglichst wenig Befehle zu verwenden die nur auf bestimmten Karten gehen, aber es klingt ja schonmal so als würde Multitexturing quasi standard sein... hinzu kommt dass es gut sein kann das ich hier und dort auch mehr als zwei Texturen übereinander backen muss, und ich hab bei mir selbst getestet: meine GraKa scheint 8 MTUs zu haben, aber wieviele hat ein anderer Rechner? das scheint mir schwer zu planen.
--> VBOs damit will ich mich noch auseinandersetzen, bin noch nicht dazugekommen
--> 3D-Welt: ja es soll eine komplette 3D-Welt werden, mit Bergen, Häusern etc. (alles schon mehr oder weniger ausprobiert und funktioniert). Licht & Schatten klappen noch nicht weil ich zu doof bin, soll aber auch noch kommen.
Aber ich dachte halt für den Anfang erstmal die Schienen und Straßen einfach flach auf den Boden zu legen... weil sie das ja "in echt" auch tun ^^ - aber bin offen für andere Vorschläge, also @ Lossy Ex: meinst du mit deinem Vorschlag das was ich vorher schon selbst als "Bahndammlösung" geschrieben habe? Oder was meinst du mit "Schienen Strassen Brücken" designen? Wobei ich das zumindest mit Brücken ohnehin vorhatte... die aber erstmal der einfachheit weglassen wollte (zunächst sollten X-Kreuzungen in alle Richtungen befahrbar sein, ausserdem dürfen sich Züge vermutlich später nach belieben begegnen, überholen etc. ohne einen Unfall zu bauen, das ist Spielkonzept).
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen. (Koreanisches Sprichwort)
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Zitat:
meine GraKa scheint 8 MTUs zu haben
Ich würde mal behaupten, dass du eine ATI Grafikkarte hast. NVidia hat in seiner Fixed Function glaube ich nur 4 TMUs implementiert. Mit Hilfe von Shadern kann man aber bei beiden auf 16 TMUs zugreifen. Ohne Shader sollten wohl 4 kein Problem sein. Wichtig ist dabei nur, dass du solche Sachen immer abfragst. Also nicht einfach so benutzen sondern erfragen ob MultiTexturing unterstützt wird und wie viele TMUs.
Bahndammlösung: Ich bin mir nicht sicher was du damit meinst. Allerdings meinte ich wirklich echte 3D Objekte. Also bei Schienen ein paar Bohlen wo obendrauf ein paar Schienen liegen. Beim Designen muss man natürlich höllisch auf die richtigen Abstände und Dimensionen achten. Diese "Model" kann man mehrfach hintereinander legen und bekommt dann eine gerade Strecke. Bzw an der ein oder anderen Stelle dann auch eine Kurve oder weiche. Je nachdem wie man das aufbauen will könnte man das direkt im Deisgner mit einem Untergrund vermischen oder man macht ein Set aus verschiedenen Untergründen und rendert die Schienen dann da rein.
Für den Anfang kann man auch einen glatte Fläche machen. Je nachdem wie perfekt man es haben will. Normal hat man um die Bohlen auch noch Schotter bzw ist die Schiene auch vertieft. (Schotter gehört aber eigentlich zur Schiene so bräuchte man es nur 1 mal designen). Da muss man dann natürlich den eigentlichen Untergrund austauschen. Also Untergrund muss dann auch für jedes Quadrat seperat gezeichnet werden. Kann man auch beliebig erweitern. Nur ich denke wenn du zu erst viel aufwand in die Multitexturen steckt, dann hättest du das auch gleich in simple Modelle stecken können. Der Unterschied ist nur marginal.
Registriert: Do Jul 23, 2009 04:33 Beiträge: 157
Programmiersprache: Turbo Delphi Pro
Das mit den Bohlen und Schotter ist ne nice Idee, werde mir das notieren, jedoch für den ersten Anfang schießt dies über das Ziel hinaus. Zunächst erstmal fettes thx an alle, ihr habt mir Wege aufgezeigt und damit werde ich jetzt experimentieren allerdings nicht mehr heute, denn nun werde ich grillen
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen. (Koreanisches Sprichwort)
Wie wäre es für glDepthFunc() GL_LEQUAL? Dann würde alles, was näher ist gezeichnet werden, wie schon gehabt, und alles, was auf der gleichen Z-Koordinate schon existiert auch. Dann könnte das "Untergrund-Quad" und das "Layer-Quad" (mit Schienen/Straßen/etc) identisch sein. Nur die Reihenfolge wäre wichtig. ERST Untergrund, DANN Layer.
Wäre wahrscheinlich die simpelste Methode...
_________________ Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut. Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’. Und du schaust mich an und fragst ob ich das kann. Und ich denk, ich werd' mich ändern irgendwann. _________________Farin Urlaub - Bewegungslos
Mitglieder in diesem Forum: 0 Mitglieder und 26 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.