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

Aktuelle Zeit: Mi Jul 09, 2025 19:35

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: gluSphere Und Texturen.
BeitragVerfasst: Do Sep 06, 2007 10:13 
Offline
DGL Member

Registriert: Di Sep 04, 2007 14:49
Beiträge: 14
So, ich arbeite grade die Tutorials durch und dem Autoren "Ging die Sonne auf".

Ich wollte das Sonnensystem nachbilden, aber nicht mit Dreiecken sondern mit Kugeln.

Funktioniert alles wunderbar, doch möchte ich, dass die Sonne und Erde verschiedene Texturen kriegen.

Code:
  1.   glPushMatrix();
  2.     glTranslatef(0,0,-10);
  3.     gluSphere(Sonne,2, 520, 520);
  4.   glPopMatrix();
  5.  
  6.  
  7.   glPushMatrix();
  8.     glTranslatef(0,0,-10);
  9.     glRotatef(i,0,1,0);
  10.     glTranslatef(0,0,5);
  11.     glRotatef(i*20,0,1,0);
  12.     gluSphere(Erde, 1, 520, 520);
  13.   glPopMatrix();


Anscheinend nimmt gluSphere immer die zuletzt geladene Textur und schmeisst diese auf die Sphere.

Wie kann ich mit SDL 2 Texturen laden und die auf beide Kugeln aufteilen (Eine Textur für eine Kugel)?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 06, 2007 10:17 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Du musst vor dem Zeichnen des jeweiligen Objekts die passende Textur binden.

glBindTexture

Das Prinzip ist das gleiche wie beim setzen der Farbe mittels glColor.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 06, 2007 10:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
glBindTexture sollte da durchaus hilfreich sein.

//Edit: huch, da war wer schneller :D

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: Do Sep 06, 2007 10:22 
Offline
DGL Member

Registriert: Di Sep 04, 2007 14:49
Beiträge: 14
Code:
  1. glPushMatrix();
  2.     glTranslatef(0,0,-10);
  3.     glBindTexture(Sonne,TexID[0]);
  4.     gluSphere(Sonne,2, 520, 520);
  5.   glPopMatrix();
  6.  
  7.  
  8.   glPushMatrix();
  9.     glTranslatef(0,0,-10);
  10.     glRotatef(i,0,1,0);
  11.     glTranslatef(0,0,5);
  12.     glRotatef(i*20,0,1,0);
  13.     glBindTexture(Erde,TexID[1]);
  14.     gluSphere(Erde, 1, 520, 520);
  15.   glPopMatrix();


So richtig? Und das laden 2er Texturen (Hab mir gedacht, die im Array zu speichern) ist mir noch nicht ganz klar.

Code:
  1. tex := IMG_Load(PChar('./textures/Sonne.JPG'));
  2.   if assigned(tex) then
  3.   begin
  4.     glGenTextures(1, PGLuint(TexID[0]));
  5.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  6.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  7.     glTexImage2D(GL_TEXTURE_2D, 0, 3, tex^.w, tex^.h,0, GL_RGB, GL_UNSIGNED_BYTE, tex^.pixels);
  8.  
  9.  
  10.     SDL_FreeSurface(tex);
  11.  
  12.   end;
  13.  
  14.   tex := IMG_Load(PChar('./textures/marmor.JPG'));
  15.   if assigned(tex) then
  16.   begin
  17.     glGenTextures(1, PGLuint(TexID[1]));
  18.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  19.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  20.     glTexImage2D(GL_TEXTURE_2D, 0, 3, tex^.w, tex^.h,0, GL_RGB, GL_UNSIGNED_BYTE, tex^.pixels);
  21.  
  22.  
  23.     SDL_FreeSurface(tex);
  24.  
  25.   end;


Geht das so? Oder muss ich bei glGenTextures eine 2 als ersten Parameter eingeben? Wie würde ich dann beide unterschiedlich auslesen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 06, 2007 10:25 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Zeus hat geschrieben:
Geht das so? Oder muss ich bei glGenTextures eine 2 als ersten Parameter eingeben? Wie würde ich dann beide unterschiedlich auslesen?


Ja, das geht so. Der erste Parameter legt nur fest, wieviele Texturen auf einmal allokiert werden sollen. Daher brauchst du in deinem Fall nur eine 1. Anders wäre es, wenn du mit nur einem glGenTextures-Aufruf dein ganzes array allokieren wolltest, dann müsstest du eine 2 als ersten und den pointer auf das erste array-element als zweiten angeben.

Was meinst du genau mit "unterschiedlich auslesen"?

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: Do Sep 06, 2007 10:29 
Offline
DGL Member

Registriert: Di Sep 04, 2007 14:49
Beiträge: 14
Lord Horazont hat geschrieben:
Was meinst du genau mit "unterschiedlich auslesen"?


Wenn die erste Lösung richtig war, ist das völlig egal.
Ich dachte nur, er würde 2 Texturen in einem Cardinal speichern, und die würde er ja aufeinmal aufrufen, wenn ich TexID[0] benutze.

Danke für die Hilfe!

mfg
Zeus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 06, 2007 10:33 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Halt

Mir fällt da gerade was auf an deinem Code: du schreibst dort glBindTexture(Erde,...) und nochmal mit Sonne

Das ist falsch.
zunächst gibt es glBindTexture so als befehl nicht. Es gibt aber glBindTexture2D. Und der erste Parameter ist Target, welcher festlegt, was für eine Textur du verwenden willst. Bei glBindTexture2D ist das normalerweise GL_TEXTURE_2D. Deine Aufrufe müssten also folgende sein:

Code:
  1.  
  2. glPushMatrix();
  3.     glTranslatef(0,0,-10);
  4.     glBindTexture2D(GL_TEXTURE_2D,TexID[0]);
  5.     gluSphere(Sonne,2, 520, 520);
  6.   glPopMatrix();
  7.  
  8.  
  9.   glPushMatrix();
  10.     glTranslatef(0,0,-10);
  11.     glRotatef(i,0,1,0);
  12.     glTranslatef(0,0,5);
  13.     glRotatef(i*20,0,1,0);
  14.     glBindTexture2D(GL_TEXTURE_2D,TexID[1]);
  15.     gluSphere(Erde, 1, 520, 520);
  16.   glPopMatrix();
  17.  


//Edit:
Ich erklär das am besten nochmal:
Der grund dafür ist, dass OpenGL immer nur eine Textur (es sei denn, man benutzt multitexturing) aktiv haben kann. Die zu verwendende Textur setzt du beispielsweise mit glBindTexture2D. Alle folgenden OpenGL aufrufe verwenden dann diese Textur zum Zeichnen, bis du entweder eine andere bindest oder mit glBindTexture2D(GL_TEXTURE_2D, 0) die textur unbindest.

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: Do Sep 06, 2007 10:36 
Offline
DGL Member

Registriert: Di Sep 04, 2007 14:49
Beiträge: 14
glBindTexture2D ist ein undefinierter Bezeichner. Ich verwende an Units

glu, Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, dglOpenGL, SDL, SDL_Image

Fehlt hier noch etwas?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 06, 2007 10:44 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also ich weiß nicht was in der glu enthalten ist aber in der dglOpenGL sind eigentlich auch die Glu funktionen enthalten.

Und der Befehl heißt glBindTexture. Da ist nichts mit 2D im Namen. ;)

Außerdem ist das Erstellen der Textur nicht ganz Richtig. Denn nach dem erstellen einer Textur muss dise auch erst einmal an ein Target gebunden werden. Und beim Erstellen ist es besser, wenn du Pointer des Eintrages übergibst und nicht den Eintrag als Pointer castest. Weiß nicht ob es da auch zu Problemen kommen kann aber ich mache so etwas grundsätzlich so.

Code:
  1.     glGenTextures(1, @(TexID[1]));
  2.     glBindTexture(GL_TEXTURE_2D, TexID[1]);
  3.  
  4.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  5.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  6.     glTexImage2D(GL_TEXTURE_2D, 0, 3, tex^.w, tex^.h,0, GL_RGB, GL_UNSIGNED_BYTE, tex^.pixels);


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 06, 2007 10:46 
Offline
DGL Member

Registriert: Di Sep 04, 2007 14:49
Beiträge: 14
Wie kann ich denn dann 2 verschiedene Texturen abwechseln zeichnen, ohne sie neu zu laden?

So:
Code:
  1.   glPushMatrix();
  2.     glBegin(GL_QUADS);
  3.       glBindTexture(GL_TEXTURE_2D, TexID[0]);
  4.       glTexCoord2f(0,0); glVertex3f(-1,-1,0);
  5.       glTexCoord2f(0,1); glVertex3f(-1,1,0);
  6.       glTexCoord2f(1,1); glVertex3f(1,1,0);
  7.       glTexCoord2f(1,0); glVertex3f(1,-1,0);
  8.     glEnd;
  9.  
  10.   glPushMatrix();
  11.     glBegin(GL_QUADS);
  12.       glBindTexture(GL_TEXTURE_2D, TexID[1]);
  13.       glTexCoord2f(0,0); glVertex3f(-1,-1,0);
  14.       glTexCoord2f(0,1); glVertex3f(-1,1,0);
  15.       glTexCoord2f(1,1); glVertex3f(1,1,0);
  16.       glTexCoord2f(1,0); glVertex3f(1,-1,0);
  17.     glEnd;
  18.  


geht es nicht, wird alles in TexID[1] gezeichnet, vermutlich weil sie als letztes geladen wurde.

//Edit:

Das
Zitat:
nd beim Erstellen ist es besser, wenn du Pointer des Eintrages übergibst und nicht den Eintrag als Pointer castest. Weiß nicht ob es da auch zu Problemen kommen kann aber ich mache so etwas grundsätzlich so.


habe ich nicht verstanden. Wie wäre denn (anschaulich) die Alternative im Quelltext zu sehen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 06, 2007 10:56 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ups... :oops: Sowas kommt davon, wenn man gerade keinen eigenen Quelltext zur hand hat.

glBindTexture muss außerhalb von glBegin .. glEnd aufgerufen werden, daher funktioniert dein Code nicht.
also einfach das glBindTextur vors glBegin und dann sollte es langsam gehn.

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: Do Sep 06, 2007 11:24 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Habe gerade mal in deinen Beiträgen das Codetag durch das Pascaltag ersetzt. War zu faul unter jedem ein Kommentar einzufügen. ;)

Genau. Das glBindTexture muss außerhalb von glBegin und glEnd stehen. Generell lässt sich sogar sagen, dass nur Eigenschaften eines Vertex innerhalb von glBegin und glEnd gesetzt werden dürfen. Also Farbe, Position via glVertex, Texturkoordinate etc. Alles andere DARF nicht in diesem Block enthalten sein. Falls doch wird der Aufruf meistens stumpf ignoriert. Aber legal ist es trotzdem nicht. ;)

Wenn du eine Textur nicht mehr brauchst und später etwas Texturloses zeichnen möchtest, dann muss du die Textur wieder deaktivieren. Also entweder über ein glBindTexture(GL_TEXTURE_2D, 0) oder glDisable(GL_TEXTURE_2D). Wenn du das Target deaktivierst dann musst du es bei Bedarf aber wieder aktivieren. Sonst sieht du die Textur wieder nicht.

Außerdem solltest du immer darauf achten, dass du zu einem glPushMatrix immer auch ein passendes glPopMatrix hast (Andersrum natürlich genau so). Da du sonst zu viele Matrizen gesichert hast und es keinen Platz mehr gibt. Ergo. Fehler und Langsam. Bzw wenn möglich solltest du glPushMatrix und glPopMatrix auch eher sparsam einsetzen. Also nur dort wo es benötigt wird.

Und was ich bei glGenTextures meinte. Du übergibst ja.
Code:
  1. PGLuint(TexID[0])

Aber genau genommen wird bei PGLuint() der Inhalt als Pointer interpretiert. In dem Falle möchtest du aber den Pointer der Speicherstelle haben. Und dafür ist der Operator @ da.
Code:
  1. @(TexID[0])

Es mag sein, dass das jetzt mit einem Array funktioniert aber spätestens, wenn du eine integer Variable hast wird das ein Problem werden. Deswegen solltest du zwischen Casten (interpretieren) und die tatsächlich Adresse eine Unterscheidung machen. Evtl sieht so etwas der ein oder andere Kompiler auch noch anders.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 06, 2007 12:57 
Offline
DGL Member

Registriert: Di Sep 04, 2007 14:49
Beiträge: 14
Danke Sehr, jetzt geht es. Ohne @ gings nicht, und auch nicht mit glBindTexture im Block, aber mit beidem richtig geht's nun.


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 9 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.018s | 15 Queries | GZIP : On ]