Hallöchen erstmal, ich bin neu hier und hab auch gleich eine kleine Frage.
Ich hab ein kleines Problem mit der Texturierung eines Quads. Ich habe eine Grafik in verschiedenen Animationsstufen und will diese je nach Frame auf den Quad "kleben". Das Problem ist, scheinbar stimmt etwas mit der Koordinatenübergabe nicht so ganz. Denn wenn ich für die Textur-Koordinaten etwa glTexCoord2f(0,5, 0,5) angebe, dann nimmt er nicht von der oberen linken Ecke die Hälfe der Textur sondern von der unteren linken. Matrixtechnisch zählt OGL ja immer von der linken unteren, aber Texturtechnisch sollte es doch eigentlich schon von links oben aus gehen, oder etwa nicht? So ist es etwa im Bomberman-Tutorial beschrieben. Dort ist das Viertel des Bildes in der oberen Hälfte zu finden, nicht in der unteren.
Zum besseren Verständnis, hier ein kleines Bild meines Problems:
Oben der Quellcode, unten links die Textur und unten rechts die Szene in OpenGL gerendert. Dabei sieht man, dass er von unten links die 0,5 Maßeinheiten der Textur genommen hat und nicht von oben rechts. Denn er zeigt ja das untere Viertel der Textur an und nicht etwa wie erwartet, das oben links.
Meine Matrix und den Viewport hab ich wie folgt eingerichtet:
Code:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0, 0, 1024, 768);
glOrtho(0, 1024, 0, 768, 0, 128);
Vielleicht hat schon jemand mit soetwas seine Erfahrungen gemacht und kann mir helfen? Ich müsste eigentlich nur wissen, ob OGL generell von unten links ausgeht und nicht von oben links bei Texturen. Dann müsste ich meinen Code zwar umschreiben, aber wenn man das weiß, ist es ja auch kein Problem. Verwirrend eben nur, dass es in den Tutorials anders beschrieben ist.
(Ach ja, ich schreibe in C++, macht aber wohl kaum einen Unterschied zu diesem Problem.)
Wenn man die ganze Textur sehen will, dann muss du ungefähr so machen:
Code:
glBegin(GL_QUADS);
glTexCoord2f(0,0); glVertex3f(...);
glTexCoord2f(1,0); glVertex3f(...);
glTexCoord2f(1,1); glVertex3f(...);
glTexCoord2f(0,1); glVertex3f(...);
glEnd();
[/code]
Ja, das ist klar, dabei gibt es auch keine Probleme. Wenn ich jetzt aber nur einen kleinen Teil der Textur haben will, eines dieser 20 Frames, dann gibt's Probleme bei der Koordinierung dieses Frames. Normalerweise geht man doch von der oberen linken Ecke aus. Gibt man dort also (0.2, 0.25) ein, müsste man eigentlich das erste Bildchen oben links sehen. Man sieht aber dann in OGL das Bild unten links. Also ist der Ursprung der Textur komischer Weise unten links und nicht oben links. Die Frage war nun, ob das generell so ist, oder ob ich da was falsch gemacht habe. In den Tutorials welche ich bisher durchgearbeitet habe, ging man von der oberen linke Ecke aus. (weshalb ich jetzt nicht genau weiß, was ich da glauben soll).
Registriert: Mi Dez 15, 2004 20:36 Beiträge: 454 Wohnort: Wien, Österreich
Zitat:
Note that in the above bitmap, Windows maps indices to pixels beginning with the bottom scan line of the rectangular region and ending with the top scan line. (A scan line is a single row of adjacent pixels on a video display.) For example, the first row of the array (row 0) corresponds to the bottom row of pixels, scan line 31. This is because the above bitmap is a "bottom-up" device-independent bitmap (DIB), a common type of bitmap. In "top-down" DIBs and in device-dependent bitmaps (DDBs), Windows maps indices to pixels beginning with the top scan line.
_________________ "Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump
Ahja, also hab ich ein Bitmap welches unten links beginnt. Gut zu wissen, nur wie erstellt man dann ein anderes (von oben links beginnend)? Von was ist es abhängig, ob man ein Bitmap hat welches unten beginnt oder eines welches oben beginnt? Kann man das vielleicht irgendwie umändern, liegt es an der Laderoutine oder einer OpenGL Einstellung die einfach zu ändern ist?
(Wär auch noch schön wenn du die Quelle deines Zitats posten würdest, dann kann ich da mal nachlesen was es sonst noch wissenswertes gibt).
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Das wird ihm wohl wenig helfen. Da is ja trotzdem alles falschrum.
Ehrlichgesagt hör ich jetzt das erstemal davon, dass es 2 verschiedene Bitmaps gibt. Die Daten liegen ja anscheinend richtig vor, nur sollten die Zeilen in umgekehrter reihenfolge geladen werden. Hmmm.... Komisch. Ich hatte sowas noch net. Kann aber auch sein, dass ichs ignoriert habe und jedesmal entsprechend anders Texturiert hab.
Speicher dein Bmp einfach nochmal mit verschiedenen Programmen ab. Vielleicht findest du eins, welches es anders abspeichert.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
@sniper_w: Das was in deinem Text beschrieben wird klingt für mich so wie die Bilder im Speicher liegen. Stellt sich mir aber die Frage ob die auch unterschielich in Dateien gespeichert werden. Und das denke ich mal nicht. Bitmap werden grundsätzlich von unten nach oben gespeichert.
Ich denke mal eher, dass es der Funktionsweise deines Loaders liegt. Sascha beschreibt in dem Bomberman Tutorial, dass er die glBMP verwendet. In dem Texturen Tutorial von Phobeus wird glaux verwendet und dort sind die Texturkoordinaten genau so wie sie bei dir beschrieben wurden. Die Textures (glBMP basiert darauf) ließt die Bitmapdatei am Stück ein. Also werden deren Daten von Unten nach oben abgelegt. In meinem Loader benutze ich die Bitmapklasse von Delphi und lege die Daten von oben nach unten ab. So wie ja normal auch im Windowsspeicher liegen. Also sind bei mir die Koordinaten wie bei dir und der glaux. Das spielt normal auch keine rolle. Allerhöchstens dann wenn es an die Koordinaten geht.
Du könntest deine Koordinaten umderehen in dem du 1 - ... machst oder eben in dem du das Laden veränderst. Normal sollte es auch klappen wenn du die Bilder flipst. Das ist aber gefährlich. Nachher vergisst du das irgendwann und wunderst dich warum es so komisch ist.
Registriert: Sa Mai 04, 2002 19:48 Beiträge: 3830 Wohnort: Tespe (nahe Hamburg)
Also jetzt verwirrt ihr mich alle ein wenig (liegt vielleicht auch daran, dass ich die neusten JEDI Header hier auf dem L.-Kasten nicht zu einer Kooperation bewegen kann und lange nichts mehr gemacht habe), aber... Das sollte mit dem internen Aufbau ja nichts zu tun haben. Fakt ist doch, dass Sunny die Textur bereits zur Hälfte angezeigt bekommt mit seinem Loader (what ever it is *g). Seine Frage lautete ja, ob der Textur-Ursprung unten links ist. Ja, sollte bei einem normalen Szenario der Fall sein. Nahezu alle Ursprünge in OpenGL sind unten links und nicht oben rechts, wie es z.B. bei GDI der Fall ist. Das sollte also vollkommen korrekt sein. Entweder paßt Du Dich auf dieser Weise die Texture-Koordinaten an oder Du setzt das erste Frame unten links.
Aber nun wo ich mir Sascha Bomberman ansehe, fange ich auch ein wenig an zu zweifeln. Gehen wir das ganze mal auf einer rationaleren Eben an: Sunny, welchen Loader verwendest Du zum laden der Texturen (ansonsten nein, sollte eigentlich keine Schwierigkeiten machen, wenn Du C++ nutzt)
_________________ "Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ja das meinte er.
Ich denke auch mal, dass der Trugschluss entstanden ist, dass der Ursprung oben links ist, da einige Loader die Texturen nicht wieder Flippen und somit der eindruck entsteht. (Doppelte negierung) Hat mich auch ein wenig durcheinander gebracht.
Registriert: Sa Mai 04, 2002 19:48 Beiträge: 3830 Wohnort: Tespe (nahe Hamburg)
Das alle Leute immer wissen, was ich meine ( und das sie dabei auch immer noch recht haben müssen... Frechheit) Ja, also damit sollte die Frage ja beantwortet worden sein. Rein technisch sollte es aus keiner der Beiden Richtungen ja wirklich ein Problem machen. Höhe - y ist dann halt die Position im umgekehrten System. Oder halt wie Sascha bereits anfangs in einem Array speichern, wo welches Bild anfängt. Damit sollte es dann irgendwie klappen, zumindest solange man den Loader nicht wechselt *g
_________________ "Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."
Loader, uff, also ich hab mir einfach mal den TGA-Loader von NeHe kopiert, da ich als Textur eine TGA-Datei verwende und mir bisher wenig Mühe machen wollte, um selbst einen Loader zu schreiben. Deshalb vorerst der Loader von NeHe: (http://nehe.gamedev.net/)
Der lädt afaik nur unkomprimierte TGAs und sieht wie folgt aus:
Code:
bool LoadTGA(TextureImage *texture, char *filename) // Loads A TGA File Into Memory
return true; // Texture Building Went Ok, Return True
}
Ich schreibe eben, wie gesagt, in C++ und nicht in Delphi.
Und jetzt nochmal zu der Sache, dass BMPs anders herum in der Datei liegen. Gildet das denn auch für TGAs? Im Endeffekt wäre es ja nicht schlimm, wenn der Ursprung eben unten links wäre, hauptsache es ist dann immer so und ich kann es intern umrechnen damit es korrekt angezeigt wird. Danke schonmal für die Antworten bisher.
Registriert: Mi Dez 15, 2004 20:36 Beiträge: 454 Wohnort: Wien, Österreich
Also, soviel Staub über nichts. Ich gebe dir einen Vorschlag. Zwar ist das nur eine Behandlung von Symptom und keine Lösung selbst. Alle Pic. Dateien, die dein Progam benutzt (laden muss), egal welche Typ, solltest du vorher in einem einzigem Bildbearbeitungsprogam vorbereiten = richtig Ausrichten. Was dabei mir "richtig" gemeint ist, entscheidest du.
[EDIT]
Zitat:
zumindest solange man den Loader nicht wechselt *g
Inklusiv diese Bemerkung.
_________________ "Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump
Also, soviel Staub über nichts. Ich gebe dir einen Vorschlag. Zwar ist das nur eine Behandlung von Symptom und keine Lösung selbst. Alle Pic. Dateien, die dein Progam benutzt (laden muss), egal welche Typ, solltest du vorher in einem einzigem Bildbearbeitungsprogam vorbereiten = richtig Ausrichten. Was dabei mir "richtig" gemeint ist, entscheidest du.
hähä, die Sprites kommen ja aus einem anderen Spiel von mir, welches DirectX noch verwendet hat, und da war der Ursprung ja noch oben links. Deshalb waren die mal korrekt ausgerichtet. Jetzt natürlich nicht mehr, wie es scheint, fängt der Textur-Ursprung ja nun unten links an. Wenn dem dann so ist, werd ich es auch noch korrekt ausrichten. War ja auch nur erstmal die Grundfrage, ob ich da einen Fehler im Einladen gemacht habe oder ob das so normal ist.
Mitglieder in diesem Forum: 0 Mitglieder und 5 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.