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

Aktuelle Zeit: Di Jul 15, 2025 09:41

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



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Texturen laden
BeitragVerfasst: So Apr 13, 2008 10:11 
Offline
DGL Member
Benutzeravatar

Registriert: So Apr 13, 2008 09:52
Beiträge: 30
Hallo

Ich hab vor kurzem erst angefangen die Tutorials durch zulesen.
Bin erst beim Tutorial 4 mit den Texturen.

Bis hierhin hatt alles gut geklappt nur beim einbinden der Texturen versteh ich etwas nicht genau:

Im Tutorial steht es so geschrieben

Code:
  1. glGenTextures(1, @TexID);
  2. glBindTexture(GL_TEXTURE_2D, TexID);


Aber TextID ist undefiniert
Darum wollt ich fragen was ich machen soll.

so sieht das bei mir aus:

Code:
  1. procedure TGLForm.FormCreate(Sender: TObject);
  2. var
  3. tex : PSDL_Surface;
  4. begin
  5. ...
  6. glEnable(GL_TEXTURE_2D);
  7.  
  8. tex := IMG_Load('./test.jpg');
  9.   if assigned(tex) then
  10.   begin
  11.     glGenTextures(1, @TexID);
  12.     glBindTexture(GL_TEXTURE_2D, TexID);
  13.  
  14.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  15.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  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.  
  21. end;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 13, 2008 10:20 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
Code:
  1.  
  2. var
  3.   TexID : GLuint;
  4.  

Dann ist Texid definiert - initialisiert wird es dann von glGenTextures. Wahrscheinlich musst Du TexID globl definieren, damit Du dann von überall darauf zugreifen kannst. In den http://www.delphigl.com/launcher.php?em=files Files müssten immer auch im wesentlichen Lauffähige Sourcen herumliegen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 13, 2008 11:02 
Offline
DGL Member
Benutzeravatar

Registriert: So Apr 13, 2008 09:52
Beiträge: 30
Vielen dank
Hatt sich erledigt

nur was ich nun nicht genau verstehe ist das mein Bild aufm Kopf steht

Ich hab es so stehen:

Code:
  1. glBegin(GL_QUADS);
  2.   glTexCoord2f(0,0); glVertex3f(-1,-1,0);
  3.   glTexCoord2f(0,1); glVertex3f(-1,1,0);
  4.   glTexCoord2f(1,1); glVertex3f(1,1,0);
  5.   glTexCoord2f(1,0); glVertex3f(1,-1,0);
  6. glEnd;


das bedeutet doch lege
die Textur (0,0) also links unten auf den Punkt (-1,-1,0) also links unten
die Textur (0,1) also links oben auf den Punkt (-1,1,0) also links oben
die Textur (1,1) also rechts oben auf den Punkt (1,1,0) also rechts oben
die Textur (1,0) also rechts unten auf den Punkt (1,-1,0) also rechts unten

aber meine jpg wird aber nicht richtig angezeigt


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 14, 2008 13:58 
Offline
DGL Member
Benutzeravatar

Registriert: Do Aug 25, 2005 16:00
Beiträge: 189
Programmiersprache: Java, C#
Lucifer hat geschrieben:
Vielen dank
Hatt sich erledigt

nur was ich nun nicht genau verstehe ist das mein Bild aufm Kopf steht

Ich hab es so stehen:

Code:
  1. glBegin(GL_QUADS);
  2.   glTexCoord2f(0,0); glVertex3f(-1,-1,0);
  3.   glTexCoord2f(0,1); glVertex3f(-1,1,0);
  4.   glTexCoord2f(1,1); glVertex3f(1,1,0);
  5.   glTexCoord2f(1,0); glVertex3f(1,-1,0);
  6. glEnd;


das bedeutet doch lege
die Textur (0,0) also links unten auf den Punkt (-1,-1,0) also links unten
die Textur (0,1) also links oben auf den Punkt (-1,1,0) also links oben
die Textur (1,1) also rechts oben auf den Punkt (1,1,0) also rechts oben
die Textur (1,0) also rechts unten auf den Punkt (1,-1,0) also rechts unten

aber meine jpg wird aber nicht richtig angezeigt


Eigentlich schon. Allerdings gibt es Bilderformate, die die Bilder auf dem Kopf speichern. Das Standart Windows BMP ist so ein Fall wo Bilder auf dem Kopf stehen, bei Targa's gibt es ein Flag das angibt ob das Bild auf dem Kopf steht oder nicht.

Ich weiß allerdings nicht wie das bei .jpg Dateien ist.
Es wird also aller wahrscheinlichkeit nach richtig angezeigt :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 14, 2008 14:36 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
JPEG sind sowieso ganz anders komprimiert als tga oder bmp. Außerdem wird mit SDL geladen und dann müssen sie immer richtig herum geladen werden, denn SDL hat dafür kein Flag bei den Surfaces.

Wenn du dich in 3D befindest, dann ist es aber so, dass die Y Richtung (nach oben) positive Werte hat und nach unten sind negative Werte. Umgedreht zu dem was du normal in 2D (GDI) hast. In OpenGL 2D kann man das frei bestimmen. Der eine mag es so wie in 3D der Andere mag eher wie im Windows.

Im Zweifel lass mal die Textur weg und färbe die obere Kante deines weißen Quads mit Blau ein. Die Kannte sollte laut meiner Aussage jetzt unten erscheinen. Bzw wenn du Backface Culling aktivierst sollte deine Fläche auch verschwunden sein, da aktuell die Rückseite sichbar sein müsste.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 14, 2008 14:36 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Und bevor du später stundenlang fehler suchst:
Die Fläche wird verschwinden, wenn du Backface Culling aktivierst.
Also entweder die Frontfacing Fläche umdrehen oder direkt dein Quad in Umgekehrter Reihenfolge (Gegen den Uhrzeigersinn) zeichnen.

Kommt natürlich auf den Blickwinkel an.

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 14, 2008 14:50 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Noch eine kleine Anmerkung zu deinem Post. Die Texturkoordinate (0, 0) ist nicht links unten sondern links oben. Zu mindest aus der Sicht von SDL. Es gibt einige Textureloader, die BMPs und TGAs so eingelesen wie sie auf der Festplatte abgelegt sind. Und damit befanden sich die Texturen gespiegelt im Speicher und aus dieser Sicht wäre (0, 0) links unten. Aber SDL packt sie richtig herum in den Speicher weswegen (0, 0) links oben entspricht. Nichts desto trotz steht dein Quad auf dem Kopf. Reihenfolge der Vertexe. Es genügt, wenn du die Vorzeichen der Y Werte bei glVertex umdrehst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 14, 2008 16:47 
Offline
DGL Member
Benutzeravatar

Registriert: So Apr 13, 2008 09:52
Beiträge: 30
ok vielen dank
hab nun verstanden wie es abläuft

da ist dann nur noch eine sache was ich gerne wissen möchte was ich nicht sondelrich verstanden hab:

Ich hab mir eine procedure geschrieben um sagen wir mal ein Feld zu zeichnen welches ich eigentlich mit texturen belegen wollte.
Wahrscheinlich ist meine Art sehr umständlich und es ginge vielleicht auch einfacher.

Also was ich nicht genau weiss ist wie ich es hinbekommen kann dass:
- entweder das ganze feld mit 1 textur überdeckt wird
- oder dass jeder einzelne quader dieselbe textur erhält

Code:
  1. procedure quad(x,y:integer);
  2. var i,j:integer;
  3. begin
  4. //glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
  5.  
  6. x:= x div 2;
  7. y:= y div 2;
  8.  
  9. //Qudas unten Rechts
  10. for j:=1 to y do
  11. begin
  12. glBegin(GL_QUAD_STRIP);
  13.   glVertex3f(0,0,j-1);
  14.   glVertex3f(0,0,j);
  15.   for i:=1 to x do
  16.   begin
  17.     glVertex3f(i,0,j-1);
  18.     glVertex3f(i,0,j);
  19.   end;
  20. glEnd;
  21. end;
  22.  
  23. //Quads unten links
  24. for j:=1 to y do
  25. begin
  26. glBegin(GL_QUAD_STRIP);
  27.   glVertex3f(0,0,j-1);
  28.   glVertex3f(0,0,j);
  29.  
  30.   for i:=1 to x do
  31.   begin
  32.     glVertex3f(-i,0,j-1);
  33.     glVertex3f(-i,0,j);
  34.   end;
  35. glEnd;
  36. end;
  37.  
  38. //Quad oben links
  39. for j:=1 to y do
  40. begin
  41. glBegin(GL_QUAD_STRIP);
  42.   glVertex3f(0,0,-j+1);
  43.   glVertex3f(0,0,-j);
  44.  
  45.   for i:=1 to x do
  46.   begin
  47.     glVertex3f(-i,0,-j+1);
  48.     glVertex3f(-i,0,-j);
  49.   end;
  50. glEnd;
  51. end;
  52.  
  53. //Quad oben rechts
  54. for j:=1 to y do
  55. begin
  56. glBegin(GL_QUAD_STRIP);
  57.   glVertex3f(0,0,j-1);
  58.   glVertex3f(0,0,-j);
  59.  
  60.   for i:=1 to x do
  61.   begin
  62.     glVertex3f(i,0,j-1);
  63.     glVertex3f(i,0,-j);
  64.   end;
  65. glEnd;
  66. end;
  67.  
  68. end;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 14, 2008 19:13 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Na ja. Du arbeitest mit QUAD_STRIPS und da hast du das Problem, dass es EIN Primitiv. Alles zwischen glBegin und glEnd ist ein Primitiv. Und du kannst Einstellungen nur außerhalb ändern. Texturen sind solche Einstellungen. Vertexattribute wie Farbe, Normale und TexturKoordinaten kannst du für jeden Vertex individual festlegen.

Ich würde dir empfehlen QUADS zu benutzen. Auf halbwegs aktuellen Systemen gibt es kaum noch unterschiede. Das ist beides gleich langsam. Und für große Datenmengen gibt es VBOs.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 16, 2008 17:34 
Offline
DGL Member
Benutzeravatar

Registriert: So Apr 13, 2008 09:52
Beiträge: 30
ok ich versuch dann mal paar sachen


dann hab ich noch ein anderes problem jetzt:

ich versuch eine bmp zu laden und auf einen quad zu legen
aber das programm geht nichtmal an und der compiler sagt nur acces violation

liegt wohl daran dass ich eine 8bittiefe bmp benutze oder?

wie oder wo stell ich ein beim laden ein damit ich diese 8bittiefe bmp laden kann?

Code:
  1. texture[2] := IMG_Load('./test.bmp');
  2.   if assigned(texture[2]) then
  3.   begin
  4.     glGenTextures(1, @test);
  5.     glBindTexture(GL_TEXTURE_2D, test);
  6.  
  7.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  8.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  9.     glTexImage2D(GL_TEXTURE_2D, 0, 3, texture[2]^.w, texture[2]^.h,0, GL_RGB, GL_UNSIGNED_BYTE, texture[2]^.pixels);
  10.  
  11.     SDL_FreeSurface(texture[2]);
  12.    end;


so sieht das bei mir aus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 16, 2008 17:52 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Um sicher eine Bitmap laden zu können, egal welches Format, musst du sie vorher umwandeln oder die von SDL gegebenen Daten interpretieren und entsprechend an OpenGL weiterreichen (die erste Variante ist der weg des geringsten Widerstandes).

Ich habe gerade leider keinen Zugriff auf meinen Code, sonst würde ich dir aushelfen, vielleicht kann das jemand anders tun.

Ich habe das so Gelöst, dass ic mit SDL_CreateRGBSurface eine Zwischensurface erstelle, die das Pixelformat für GL_RGBA hat. Dort blitte ich dann mittels SDL_BlitSurface die ursprüngliche Bildsurface drauf und das schicke ich dann an OpenGL.

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 16, 2008 18:17 
Offline
DGL Member
Benutzeravatar

Registriert: So Apr 13, 2008 09:52
Beiträge: 30
ok die erste variante ist einfacher und funktioniert

gehört jetzt nicht sondelich zum thema aber wollte nicht unbedingt ein neues topic öffnen:

ich fange erst mit blending an un hab auch da so meine probleme (wer hätte das gedacht)

also ich hatte vor dass eine farbe in einer bmp völlig durchsichtig angezeigt wird
zum beispiel die farbe rot r1,g0,b0


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 16, 2008 18:22 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Mach dafür einen eigenen Thread auf, es lohnt sich :wink:

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 13 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.010s | 14 Queries | GZIP : On ]