Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Jul 16, 2025 20:14

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Ursprung bei 2D-Texturen?
BeitragVerfasst: Do Feb 24, 2005 22:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Feb 24, 2005 22:44
Beiträge: 29
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:
Bild

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:
  1.     glMatrixMode(GL_PROJECTION);
  2.     glLoadIdentity();
  3.     glViewport(0, 0, 1024, 768);
  4.     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.)


mfg.

Sunny


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 24, 2005 23:16 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Wenn man die ganze Textur sehen will, dann muss du ungefähr so machen:
Code:
  1.  
  2.   glBegin(GL_QUADS);
  3.    glTexCoord2f(0,0);     glVertex3f(...);
  4.    glTexCoord2f(1,0);     glVertex3f(...);
  5.    glTexCoord2f(1,1);     glVertex3f(...);
  6.    glTexCoord2f(0,1);     glVertex3f(...);
  7.   glEnd();
  8.  
[/code]

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 24, 2005 23:28 
Offline
DGL Member
Benutzeravatar

Registriert: Do Feb 24, 2005 22:44
Beiträge: 29
sniper_w hat geschrieben:
Wenn man die ganze Textur sehen will, dann muss du ungefähr so machen:
Code:
  1.  
  2.   glBegin(GL_QUADS);
  3.    glTexCoord2f(0,0);     glVertex3f(...);
  4.    glTexCoord2f(1,0);     glVertex3f(...);
  5.    glTexCoord2f(1,1);     glVertex3f(...);
  6.    glTexCoord2f(0,1);     glVertex3f(...);
  7.   glEnd();
  8.  
[/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).


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 24, 2005 23:44 
Offline
DGL Member

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.

:roll:

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 24, 2005 23:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Feb 24, 2005 22:44
Beiträge: 29
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). ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 24, 2005 23:59 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Du kannst es mit MSPaint flipen, horizontal und vertikal. :wink:

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 25, 2005 00:55 
Offline
Guitar Hero
Benutzeravatar

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. :roll:

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 25, 2005 09:22 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 25, 2005 10:37 
Offline
Fels i.d. Brandung
Benutzeravatar

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..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 25, 2005 11:57 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Zitat:
Nahezu alle Ursprünge in OpenGL sind unten links und nicht oben rechts, wie es z.B. bei GDI der Fall ist

Sollte es nicht heissen :

Nahezu alle Ursprünge in OpenGL sind unten links und nicht oben links, wie es z.B. bei GDI der Fall ist

8)

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 25, 2005 12:11 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 25, 2005 12:27 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
:? Das alle Leute immer wissen, was ich meine ( :shock: 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..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 25, 2005 14:26 
Offline
DGL Member
Benutzeravatar

Registriert: Do Feb 24, 2005 22:44
Beiträge: 29
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:
  1. bool LoadTGA(TextureImage *texture, char *filename)             // Loads A TGA File Into Memory
  2. {    
  3.     GLubyte     TGAheader[12]={0,0,2,0,0,0,0,0,0,0,0,0};      // Uncompressed TGA Header
  4.     GLubyte     TGAcompare[12];                                 // Used To Compare TGA Header
  5.     GLubyte     header[6];                                      // First 6 Useful Bytes From The Header
  6.     GLuint      bytesPerPixel;                                  // Holds Number Of Bytes Per Pixel Used In The TGA File
  7.     GLuint      imageSize;                                      // Used To Store The Image Size When Setting Aside Ram
  8.     GLuint      temp;                                           // Temporary Variable
  9.     GLuint      type=GL_RGBA;                                   // Set The Default GL Mode To RBGA (32 BPP)
  10.  
  11.     FILE *file = fopen(filename, "rb");                         // Open The TGA File
  12.  
  13.     if( file==NULL ||                                           // Does File Even Exist?
  14.         fread(TGAcompare,1,sizeof(TGAcompare),file)!=sizeof(TGAcompare) ||  // Are There 12 Bytes To Read?
  15.         memcmp(TGAheader,TGAcompare,sizeof(TGAheader))!=0               ||  // Does The Header Match What We Want?
  16.         fread(header,1,sizeof(header),file)!=sizeof(header))                // If So Read Next 6 Header Bytes
  17.     {
  18.         if (file == NULL)                                       // Did The File Even Exist? *Added Jim Strong*
  19.             return FALSE;                                       // Return False
  20.         else                                                    // Otherwise
  21.         {
  22.             fclose(file);                                       // If Anything Failed, Close The File
  23.             return FALSE;                                       // Return False
  24.         }
  25.     }
  26.  
  27.     texture->width  = header[1] * 256 + header[0];              // Determine The TGA Width  (highbyte*256+lowbyte)
  28.     texture->height = header[3] * 256 + header[2];              // Determine The TGA Height (highbyte*256+lowbyte)
  29.    
  30.     if( texture->width  <=0 ||                                  // Is The Width Less Than Or Equal To Zero
  31.         texture->height <=0 ||                                  // Is The Height Less Than Or Equal To Zero
  32.         (header[4]!=24 && header[4]!=32))                       // Is The TGA 24 or 32 Bit?
  33.     {
  34.         fclose(file);                                           // If Anything Failed, Close The File
  35.         return FALSE;                                           // Return False
  36.     }
  37.  
  38.     texture->bpp    = header[4];                                // Grab The TGA's Bits Per Pixel (24 or 32)
  39.     bytesPerPixel   = texture->bpp/8;                           // Divide By 8 To Get The Bytes Per Pixel
  40.     imageSize       = texture->width*texture->height*bytesPerPixel; // Calculate The Memory Required For The TGA Data
  41.  
  42.     texture->imageData=(GLubyte *)malloc(imageSize);            // Reserve Memory To Hold The TGA Data
  43.  
  44.     if( texture->imageData==NULL ||                             // Does The Storage Memory Exist?
  45.         fread(texture->imageData, 1, imageSize, file)!=imageSize)   // Does The Image Size Match The Memory Reserved?
  46.     {
  47.         if(texture->imageData!=NULL)                            // Was Image Data Loaded
  48.             free(texture->imageData);                           // If So, Release The Image Data
  49.  
  50.         fclose(file);                                           // Close The File
  51.         return FALSE;                                           // Return False
  52.     }
  53.  
  54.     for(GLuint i=0; i<int(imageSize); i+=bytesPerPixel)         // Loop Through The Image Data
  55.     {                                                          // Swaps The 1st And 3rd Bytes ('R'ed and 'B'lue)
  56.         temp=texture->imageData[i];                             // Temporarily Store The Value At Image Data 'i'
  57.         texture->imageData[i] = texture->imageData[i + 2];      // Set The 1st Byte To The Value Of The 3rd Byte
  58.         texture->imageData[i + 2] = temp;                       // Set The 3rd Byte To The Value In 'temp' (1st Byte Value)
  59.     }
  60.  
  61.     fclose (file);                                              // Close The File
  62.  
  63.     // Build A Texture From The Data
  64.     glGenTextures(1, &texture[0].texID);                        // Generate OpenGL texture IDs
  65.  
  66.     glBindTexture(GL_TEXTURE_2D, texture[0].texID);             // Bind Our Texture
  67.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);   // Linear Filtered
  68.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);   // Linear Filtered
  69.    
  70.     if (texture[0].bpp==24)                                     // Was The TGA 24 Bits
  71.     {
  72.         type=GL_RGB;                                            // If So Set The 'type' To GL_RGB
  73.     }
  74.  
  75.     gluBuild2DMipmaps(GL_TEXTURE_2D, 3, texture[0].width, texture[0].height, type, GL_UNSIGNED_BYTE, texture[0].imageData); // ( NEW )
  76. //  glTexImage2D(GL_TEXTURE_2D, 0, type, texture[0].width, texture[0].height, 0, type, GL_UNSIGNED_BYTE, texture[0].imageData);
  77.  
  78.     return true;                                                // Texture Building Went Ok, Return True
  79. }


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. ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 25, 2005 14:48 
Offline
DGL Member

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 25, 2005 15:02 
Offline
DGL Member
Benutzeravatar

Registriert: Do Feb 24, 2005 22:44
Beiträge: 29
Zitat:
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. ;)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.013s | 17 Queries | GZIP : On ]