Registriert: Mo Jun 12, 2006 14:47 Beiträge: 75
Programmiersprache: Object FPC
Guten Morgen alle,
ich will mal wieder ein neues Spiel schreiben und dachte mir das das am Besten in OpenGL umsetzbar ist. Schlieslich ist das die wohl "beste" möglichkeit schnelle Graphiken zu erzeugen.
Worum es geht.
Mein Spiel wird diesmal 2D sein, was mittels GLortho kein Problem dasrstellt.
Allerdings gibt es da leider doch noch 1 ganz großes Problem dessen lösung noch unklar ist. Deshalb will ich mir hier mal die Meinung vieler Fachleute hohlen.
Die Landschaft in meinem Game wird zerstörbar sein. D.h. ich habe am Anfang ein Bild wie Start.jpg ( hoffentlich hat das Attechment hinzufügen geklappt )
dabei ist Weis = Transparent.
Gegen später im Spiel wird die Landschaft dann "zerstört" siehe später.jpg
Der Traum wäre natürlich wenn ich meine Graphik mittels
Code:
gluBuild2DMipmaps(
oder
glTexImage2D(
einbinden könnte. Nur leider benötigt diese Art der erzeugung der Textur ja mehrere 100 Milisekunden. D.h. wenn ich also im Spiel mittels BUMKRACH so einen Krater in die Landschaft reisen will dann mus das von Frame1 auf Frame2 Geschehen. Bei angestrebten 60 FPS sind das 16 Milisekunden und damit fällt diese Variante aus.
Ich dachte dann an eine evtl Scencilbuffer maskierung , aber meine Landschaft soll auch gescrollt werden können ( ebenfalls gezoomt ) und ich weis nicht ob ich den scencilbuffer scrollen kann. Ich gehe aber eher nicht davon aus. => diese Variante geht also auch nicht.
als Letze Idee hatte ich noch ein via
Code:
glbegin(gl_points);
gerendertes Bild das dann in einer 2D schleife einfach jeden Pixel übergibt. Die Transparenz wäre hier kein Problem. Auch das Zoomen nicht und schnell würde es sicherlich gehen.
Aber irgendwie bin ich mit dieser variante nicht zufrieden, da die Bilddaten ja dan immer duch die CPU geschleust würden.
Displaylisten fallen ja leider auch aus da die im nachhinein nicht mehr veränderbar sind.
Hier also meine Frage :
Ist mein Ansatz mit den
Code:
glbegin(gl_points);
in diesem Fall Tatsächlich die einzige möglichkeit ? oder hat mir jemand noch eine Idee die evtl eleganter = schneller wäre
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Dynamische Texturen sind überhaupt kein Problem. Du musst nur ein paar Dinge beachten.
gluBuild2DMipmaps: Unter gar keinen Umständen darfst du diese Methode benutzen. Selbst für "normale" Texturen ist diese Methode absolut nicht mehr zeitgemäß.
glTexImage2D: Ja geht. Du benötigst aber grundsätzlich immer die gesammte Textur. Wenn die Textur bereits existiert benötigt diese Methode aber länger als wie wenn sei neu erstellt wurde.
glSubTexImage2D: Das ist eher das was du suchst. Damit updatest du einen rechteckigen Bereich der Textur und das geht auch noch richtig flott, da lediglich die Daten ausgetauscht werden. Oben drein hast du auch nur eine kleinere Menge Daten die ausgetauscht werden müssen.
Stencil und gl_points sind dafür wohl fehl am platze, da stencil keine Teiltransparenzen hat und gl_points für so etwas nicht mal Aansatzweise schnell genug ist. Für evtl Sprengeffekte sind Points oder Partikel aber durchaus brauchbar. Aber nicht zum Zeichnen der Landschaft.
Falls du lediglich die Transparenz verändern willst, dann würde es sich evtl sogar anbieten, dass du 2 Texturen benutzt. Eine RGB Textur die die Landschaft enthält und eine die den Alphakanal enthält. Bei Zeichnen benutzt du dann Multitexturing um die beiden Texturen zur Laufzeit zusammen zu mergen. Damit wird der zu transportierende Speicher noch mal minimiert und das Handling wird besser, da du die Alphawerte immer direkt hintereinander liegen.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich denke, der Vorschlag von Lossy ist durchaus vernünftig. glSubTexImage2D ist wirklich schnell, bei richtiger Handhabung bekommst du da sicherlich mehrere zig Millisekunden mehr Speed raus.
Du solltest das dann halt so machen, dass du nur deine Alpha-Map veränderst, da du dann nur einen Kanal übertragen musst und so bandbreite sparst. Dabei berechnest du das Rechteck, dass verändert wurde (reicht ja bei einer Kreisförmigen Explosion der Radius und der Mittelpunkt des Kreises) und überträgst nur diesen Teil zur Grafikkarte. Dadurch sparst du eine Menge Bandbreite, vorallem bei großen Maps.
Gruß Lord 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
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ups, da is nen dreher drin, die eigentliche Funktion heißt
glTexSubImage2D
Gruß Lord 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
Das Problem ist nun wenn ich das ergebnis Rendern lasse dann funktioniert nur die Variante die momentan angegeben ist.
Die auskommentierten glTexImage2D, bzw glTexSubImage2D gehen beide nicht.
Es wird dann keine Graphik erzeugt. da gluBuild2DMipmaps allerdings geht , weis ich das die ganzen anderen Parameter also mein @c[0] und b.widht, wie b.height stimmen. Habe diese auch in power of 2 formaten ..
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Die Parameter waren nicht "falsch". Nur GL_LINEAR_MIPMAP_LINEAR erfordert MipMaps. glTexImage2D erzeugt aber von Hause aus keine MipMaps entsprechend ist die Textur in OpenGL noch nicht gültig. Es gibt aber eine Extension die es ermöglicht, dass MipMaps automatisch erzeugt werden. Aber bei 2D werden MipMaps eh kaum benötigt.
glTexSubImage2D funktioniert nur, wenn die Textur erstellt wurde. Und das geschiet erst mit glTexImage. Man kann aber bei glTexImage nil für die Daten übergeben, dann wird einfach nur eine leere Textur erstellt. Also auch der Speicher in OpenGL reserviert. Textur ist dann also gültig.
Sowohl 3 als auch $1907 (GL_RGB) sind gültig. 1-4 geben die Komponenten an. Aber anstelle dessen kann man auch ein Format angeben. Ich persönlich arbeite grundsätzlich nur mit den direkten Konstanten für die Formate.
Nur habe ich natürlich die AlphaMask natürlich mittels RGBA erzeugt, also RGB umsonst, wie man das nur als 1 Byte Pro Pixel macht ist mir nicht ganz klar gewesen ...
Registriert: Mo Jun 12, 2006 14:47 Beiträge: 75
Programmiersprache: Object FPC
OH ich bin so DOOF ich habe das GLbegin(gl_quads) ; vergessen.
Also ich hab mich durch das Tutorial durchgewälzt.
Ist ja supoer geschrieben, nur Leider klappt es noch nicht , und da ich ja gleichzeitig den Aplhatest drin habe weis ich nun nicht genau woran es liegt.
Das Ergebniss zeigt aber das der Alphatest Immer fehl schlägt.
Als Transparent Textur habe ich eine die CLfuchsia auf Transparent und den Rest auf Visible setzt. Die maske ist extra so gewählt das es wenigstens irgendwas zeigen sollte.
Da ich nicht genau weis woran es nun liegt poste ich mal alle Relevanten Teile in der Hoffnung euch fällt der Fehler auf
Code:
// LAden der Alphakanal Maske
Function LoadAlphaMask(Filename: String; Var Width, Height: Integer; Var SWidth, SHeight: double): Integer;
Da der Alphatest bei egal welchen Einstellungen immer Fehl schlägt gehe ich davon aus das ich das Mergen bzw evtl das Laden der Alpha Tex falsch mache, nur ist mir schleierhaft wo da der Fehler liegen soll
Mitglieder in diesem Forum: 0 Mitglieder und 8 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.