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

Aktuelle Zeit: Mo Jul 07, 2025 12:04

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Quadrat mit Textur
BeitragVerfasst: Sa Feb 10, 2007 14:00 
Offline
DGL Member

Registriert: Do Jan 25, 2007 19:12
Beiträge: 17
Also ich habe ein Basis Viereck das ich anzeigen kann ohne Probleme (Farben können zugewiesen werden womit ich denke ich mal alles bis auf die Textur als Fehlerquelle auschließen kann).

Ich habe eine Funktion die Texturen laden soll, diese in ein Array schmeißt und dann den index der hinzugefügten
Textur zurückgibt (um bestimmte Texturen einfacher auswählen zu können).

Code:
  1. function load_texture (Filename: string) : integer;
  2. var
  3. tex: PSDL_Surface;
  4. begin
  5. tex := IMG_LOad (PCHAR (ExtractFileDir(paramStr(0))+Filename));
  6. if assigned (tex) then
  7.         begin
  8.           setlength (Textures,length(Textures)+1);  
  9.           result:= length(Textures)-1;
  10.  
  11.           glGentextures (1,@Textures[length(Textures)-1]);
  12.          
  13.           glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  14.           glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  15.  
  16.           glTexImage2D(GL_TEXTURE_2D, 0, 3, tex^.w, tex^.h,0, GL_RGB, GL_UNSIGNED_BYTE, tex^.pixels);
  17.  
  18.           SDL_FreeSurface(tex);
  19.         end;
  20. end;
  21.  


Mein Quadrat in der Prozedur Render sieht so aus (sky ist der Rückgabewert für die einzig geladene Textur, scheint auch der richtige zu sein weil wenn ich ihn ändere erhalte ich nur noch ein weißes Viereck)


Code:
  1.  
  2.    glBindTexture (GL_TEXTURE_2D,sky);
  3.    glbegin (gl_quads);
  4.      glVertex3f( -10,0,0);
  5.      glVertex3f( 10,0,0);
  6.      glVertex3f( 10,20,0);
  7.      glVertex3f( -10,20,0);
  8.   glend;
  9.  


Ich rufe in meiner Init den Ladebefehl so auf:

sky := load_texture ('/textures/sky.bmp');

Das Ergebnis dieser Zeilen ist aber leider ein Rosa bis gelbliches Viereck was da rumvegetiert und sich leider nicht dazu überreden lässt das eigentliche Bild anzuzeigen.

Bereits überprüfte Fehler:

Datei scheint korrekt geladen zu werden (Änderungen führen zu einem nurnoch weißen Viereck)
Datei ist 256x256 Pixel groß
Ladeprozedur gibt richtigen Eintrag im Array zurück (Veränderung von Sky führen zu einem nurnoch weißen Viereck)
glEnable(GL_TEXTURE_2D) steht in der init (zum testen soll später direkt vor den Eintrag mit dem Viereck und dahinter wieder disabled werden)


Wäre super wenn jemand sich das mal angucken könnte^^ ... aber ich hab auch noch ne andere Frage:

Besteht die Möglichkeit ein bereits geladenes Bitmap(oder grad erst erstelltes) direkt als Textur weiterzugeben (am besten ohne 5000 Dateien die ich in meinen Source integrieren muss)

Vielen Dank schon mal
Matthias

_________________
*sudo*
may the force
be with
you!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 10, 2007 14:56 
Offline
DGL Member

Registriert: So Feb 19, 2006 23:46
Beiträge: 55
Das Problem ist die Funktion IMG_Load aus SDL_Image und die Parameter von glTexImage2D. Um Perfomance zu sparen konvertiert IMG_Load die Bilder nämlich in kein einheitliches Format sondern belässt so wie sie in der Datei vorliegen. Daher musst du zuerst mit SDL_CreateRGBSurface ein Surface mit den mit glTexImage2D spezifizierten Eigenschaften erstellen und mit SDL_BlitSurface konvertieren.
In meinem C++-Code (sry, kann kein Delphi) sieht das in etwa so aus:
Code:
  1.  
  2.     SDL_Surface *bitmap = IMG_Load(filename);
  3.     SDL_Surface *conv = SDL_CreateRGBSurface(
  4.             SDL_SWSURFACE, bitmap->w, bitmap->h, 32,
  5.             0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000);
  6.     SDL_BlitSurface(bitmap, 0, conv, 0);
  7.    
  8.     GLuint textureID;
  9.     glGenTextures(1, &textureID);
  10.     glBindTexture(GL_TEXTURE_2D, textureID);
  11.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  12.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
  13.                 GL_LINEAR_MIPMAP_LINEAR);
  14.     glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
  15.     glTexImage2D(
  16.         GL_TEXTURE_2D, 0, GL_RGBA, conv->w, conv->h,
  17.         0, GL_RGBA, GL_UNSIGNED_BYTE, conv->pixels
  18.     );
  19.     SDL_FreeSurface(bitmap);
  20.     SDL_FreeSurface(conv); 
  21.  
  22.  
  23.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 10, 2007 15:20 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Sofern die BMPs immer 24 Bit Farbtiefe haben sehe ich da ehrlich gesagt jetzt nicht so das Problem. Das wäre im Endeffekt sogar idealer als die Bilder vorher noch einmal zu konvertieren. Aber im Endeffekt stimmt es schon. Um kompliziertere Formatauswahlen zu vermeiden, kann man das Bild stumpf konvertieren. Ich persönlich bin da aber kein Fan von.

Im übrigen liegen BMPs typischerweise im BGR Format vor und nicht in RGB. Also müsstest du die Daten die du von IMG_Load bekommst mit dem Format GL_BGR an glTexImage2D übergeben. Sofern diese nicht konvertiert werden.

Ein andere Punkt. Wo hast du OpenGL gesagt wie er die Textur auf deiner Fläche darstellen soll? Mit anderen Worten. Wo sind deine Texturkoordinaten (glTexCoord)?

Code:
  1. glBegin(GL_QUADS);
  2.   glTexCoord2f(0, 0);
  3.   glVertex3f(-10,  0, 0);
  4.  
  5.   glTexCoord2f(1, 0);
  6.   glVertex3f( 10,  0, 0);
  7.  
  8.   glTexCoord2f(1, 1);
  9.   glVertex3f( 10, 20, 0);
  10.  
  11.   glTexCoord2f(0, 1);
  12.   glVertex3f(-10, 20, 0);
  13. glEnd;


PS: Du solltest normal dann wenn du eine Textur benutzt auch dessen Target aktivieren. Später werden stellen kommen an denen du keine Textur haben willst und dann wunderst du dich warum deine Fläche keine mehr hat.

yonibear: Dein Code setzt OpenGL 1.4 oder eine entsprechende Extension stumpf vorraus. Das ist zwar eigentlich nicht so schlimm aber sollte man mal was für alte Hardware machen kann das spannend für den Entwickler werden. ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 10, 2007 19:15 
Offline
DGL Member

Registriert: Do Jan 25, 2007 19:12
Beiträge: 17
Danke erstma für die schnelle Antwort...

Zitat:
Wo hast du OpenGL gesagt wie er die Textur auf deiner Fläche darstellen soll? Mit anderen Worten. Wo sind deine Texturkoordinaten (glTexCoord)?


Also ... ähm ... hab ich net^^. Joa daran lag es. Mir ist das beim lesen net aufgefallen weil ich auch mal wieder davon ausgegangen bin, das es einen sinnvollen Default gibt.

@Lossy eX: Wäre nett wenn du noch mal genauer beschreiben könntest was du mit:
Zitat:
PS: Du solltest normal dann wenn du eine Textur benutzt auch dessen Target aktivieren. Später werden stellen kommen an denen du keine Textur haben willst und dann wunderst du dich warum deine Fläche keine mehr hat.

meintest.



Ich habe versucht das ganze jetzt auf eine Kugel zu übertragen:
Code:
  1.  
  2.  Kugel := gluNewQuadric();
  3.      gluQuadricTexture (Kugel,true);
  4.      gluSphere (Kugel,100.0,50,50);
  5.  


Im Tutorial steht das man statt hier true GL_TRUE verwenden soll, was aber zu diesem lustigen Fehler führt(Delphi6):
Incompatible types: 'ByteBool' and 'Integer'

Also wie schon gesagt es funktioniert mit dem oben genannten Trick(true statt GL_TRUE) aber was ist dann in der Wiki-Version falsch? Oder wohl eher wahrscheinlich: Was mache ich falsch?

Und wie kann ich die Koordinaten verändern an denen die Textur aufgesetzt wird? (ich glaube mich zu erinnern dass das auch in einem der Wikis steht. Ich suche noch kann es aber net mehr finden, wäre also nett wenn ich nen kleinen Tip kriegen könnte)

_________________
*sudo*
may the force
be with
you!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 10, 2007 21:00 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Zitat:
Wäre nett wenn du noch mal genauer beschreiben könntest was du mit:

Na ja. Deine späteren Programme werden nicht nur aus einem Objekt mit einer Textur bestehen, oder? glEnable(GL_TEXTURE_2D) zu Begin setzen funktiniert zwar aber in späteren Programmen wäre es mitunter sinnvoller das dann zu aktivieren wenn du es brauchst und es dann wieder zu deaktivieren. Wenn du später Text oder so was ausgeben willst müsstest du dann die Textur deaktivieren, weil die sonst auch ne Textur hätten. Und dann würde es eh wieder aus das hinauslaufen. Aber okay. Das wirst du später auf jeden Fall noch sehe.

Bytebool vs Integer: Ja das ist bekommt. Wurde leider nicht von anfang an konsequent durchgezogen. Ich meine da habe es auch problem mit der ein oder anderen Delphiversion. GL_TRUE ist ziemlich genau das selbe wie true. Leider sind sie vom Typ her nicht kompatibel.

Ich wüsste so jetzt nicht wie du das sinnvoll anpassen könntest. Das Einzige was mir einfällt wären später shader oder das Verändern der Texturmatrix. Aber ich denke da kommt es darauf an was du machen möchtest.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Feb 10, 2007 22:02 
Offline
DGL Member

Registriert: Do Jan 25, 2007 19:12
Beiträge: 17
Zitat:
in späteren Programmen wäre es mitunter sinnvoller das dann zu aktivieren wenn du es brauchst


<--->

Zitat:
(zum testen soll später direkt vor den Eintrag mit dem Viereck und dahinter wieder disabled werden)



Da bin ich aber froh dass das etwas ist, was ich durchaus schon beachtet hab. Hab schon panik gekriegt (alle 3 Zeilen Tutorial muss ich mein Verständnis vom Begriff 3D über Bord werfen und dann auch noch so was^^)


Was mein Kugel-Problem angeht:
Dieses Problem resultierte aus einem Missverständnis bezüglich des glRotated befehls innerhalb der Modelview-Matrix.
Ich bin davon ausgegangen, dass wenn ich den Befehl verwende sich nur die Ansicht dreht, also der Befehl auch für alle bereits gezeichneten Objekte gilt. Da dies nicht der Fall ist funktioniert die Drehung auch mit mehreren Objekten über den Befehl und das Problem hat sich (erstmal) in Luft aufgelöst.

Danke für die schnellen und wirklich guten Antworten!

_________________
*sudo*
may the force
be with
you!


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]