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

Aktuelle Zeit: Sa Jun 08, 2024 07:24

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Dynamische Cubemaps (Renderpass)
BeitragVerfasst: Mi Jun 07, 2006 20:50 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
hi, ich hab mir mal das Renderpass Tutorial angeguckt, bin aber noch net 100%
draus schlau geworden, ich hab ja meine kugel:
Code:
  1.  
  2. procedure DrawSphere(CX, CY, CZ, Radius: TGLFloat);
  3. var
  4.   quad: PGLUQuadric;
  5. begin
  6.   BallCubeMap.Bind;
  7.   quad := gluNewQuadric;
  8.   try
  9.     gluQuadricTexture(quad, True);
  10.     glPushMatrix(); // Matrix sichern
  11.     glTranslatef(cx,cy,cz);
  12.     gluSphere(quad, Radius, 32, 32);
  13.     glpopmatrix;
  14.   finally
  15.     gluDeleteQuadric(quad);
  16.   end;
  17.   BallCubeMap.Unbind;
  18. end;
  19.  


die texturen werden vorerst statisch beim oncreate erstellt:
Code:
  1.  
  2. procedure CreateCubemap;
  3. begin
  4.   BallCubeMap := TglBitmapCubeMap.Create;
  5.   BallCubeMap.LoadFromFile('xpos.jpg');
  6.   BallCubeMap.GenerateCubeMap(GL_TEXTURE_CUBE_MAP_POSITIVE_X);
  7.   BallCubeMap.LoadFromFile('xneg.jpg');
  8.   BallCubeMap.GenerateCubeMap(GL_TEXTURE_CUBE_MAP_NEGATIVE_X);
  9.   BallCubeMap.LoadFromFile('ypos.jpg');
  10.   BallCubeMap.GenerateCubeMap(GL_TEXTURE_CUBE_MAP_POSITIVE_Y);
  11.   BallCubeMap.LoadFromFile('yneg.jpg');
  12.   BallCubeMap.GenerateCubeMap(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y);
  13.   BallCubeMap.LoadFromFile('zpos.jpg');
  14.   BallCubeMap.GenerateCubeMap(GL_TEXTURE_CUBE_MAP_POSITIVE_Z);
  15.   BallCubeMap.LoadFromFile('zneg.jpg');
  16.   BallCubeMap.GenerateCubeMap(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z);
  17. end;
  18.  

jetzt müsste ich doch 6 renderpasses haben, jedesmal zum ball hin mit gltranslatef und dann
jedes mal 90 in eine andere richtung drehen. ich habe gelesen dass man fov auf 90 stellen sollte,
damit der komplette raum abgedeckt wird, ich bin mir jetzt nicht ganz sicher, wie ich das mache.

das problem ist
1. fov einstellen, wie ?
2. wie renderpass benutzen ? (alles wie in der render funktion rendern nur dann in die jeweilige textur ?)

vielen dank schonmal

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Dynamische Cubemaps (Renderpass)
BeitragVerfasst: Mi Jun 07, 2006 22:45 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2067
Programmiersprache: C++
zu 1.: gluPerspective
zu 2.: Wo brauchst du da Renderpass?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 08, 2006 13:37 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
ich möchte ja eine kugel, die die umgebung spiegelt, muss ich doch alle 6 richtungen mit einem fov von 90 in die cubemap reinrendern, aber wie ich das genau mache weiß ich nicht, 1. nicht, wie man in eine textur rendert und 2. wie man das am besten aufbaut.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 08, 2006 15:21 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2067
Programmiersprache: C++
Du zeichnest die Szene ohne Kugel und rotierst dann in die passende Ansicht (In die Kugel fliegen etc ;) ).
Danach benutzt du glCopyTexSubImage2D um das Bild in die Texture zu bekommen.
Das machst du dann für den anderen Winkel (du brauchst nur 180° ;) ) genauso.
So hast du eine Texture, die du entsprechend verschoben auf die Kugel aufbringen kannst.

Die genaueren Details findest du im Tutorial Renderpass, nur würde ich SubImage anstatt Image nehmen, damit du nur eine Textur brauchst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 08, 2006 16:24 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
ich kriegs net gebacken, ich hab mir jetzt meine ballcubemap so eingerichtet:
Code:
  1.  
  2. BallCubemap: gluint;
  3.  

Code:
  1.  
  2. procedure Renderpass01(cx, cy, cz: double);
  3. const
  4.   mat_specular   : Array[0..3] of GlFloat = (1.0, 1.0, 1.0, 1.0);
  5.   mat_shininess  : Array[0..0] of GlFloat = (150.0);
  6.   mat_ambient    : Array[0..3] of GlFloat = (0.5, 0.5, 0.5, 1.0);
  7.   mat_diffuse    : Array[0..3] of GlFloat = (0.4, 0.8, 0.4, 1.0);
  8.  
  9.   light_position : Array[0..3] of GlFloat = (0, 2, 0, 1.0);
  10.   light_ambient  : Array[0..3] of GlFloat = (1, 1, 1, 1.0);
  11.   light_diffuse  : Array[0..3] of GlFloat = (1, 0.8, 0.8, 1.0);
  12. begin
  13.   glMaterialfv(GL_FRONT, GL_SPECULAR,  @mat_specular[0]);
  14.   glMaterialfv(GL_FRONT, GL_SHININESS, @mat_shininess[0]);
  15.   glMaterialfv(GL_FRONT, GL_AMBIENT,   @mat_ambient[0]);
  16.   glMaterialfv(GL_FRONT, GL_DIFFUSE,   @mat_diffuse[0]);
  17.  
  18.   glLightfv(GL_LIGHT0, GL_AMBIENT,  @light_ambient[0]);
  19.   glLightfv(GL_LIGHT0, GL_DIFFUSE,  @light_diffuse[0]);
  20.   glLightfv(GL_LIGHT0, GL_POSITION, @light_position[0]);
  21.  
  22.  
  23.   glEnable(GL_DEPTH_TEST);
  24.   glEnable(GL_TEXTURE_2D);
  25.   glEnable(GL_LIGHTING);
  26.   glEnable(GL_LIGHT0);
  27.  
  28.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  29.   glMatrixMode(GL_PROJECTION);
  30.   glLoadIdentity;
  31.   glViewPort(0, 0, 256, 256);
  32.   gluPerspective(90, 1, 0.1, 1000);
  33.  
  34.   glMatrixMode(GL_MODELVIEW);
  35.   glLoadIdentity;
  36.  
  37.   glTranslatef(cx, cy, cz);
  38.   glRotatef(90, 0, 1, 0);
  39.  
  40.   glLightfv(GL_LIGHT0, GL_POSITION, @light_position[0]);
  41.  
  42.   glpushmatrix;
  43.   DrawProc(true);
  44.   glpopmatrix;
  45.  
  46.   glBindTexture(GL_TEXTURE_CUBE_MAP, ballcubemap);
  47.   glCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB, 0, GL_RGB, 0, 0, 256, 256, 0);
  48. end;
  49.  

Code:
  1.  
  2. procedure DrawSphere(CX, CY, CZ, Radius: TGLFloat);
  3. var
  4.   quad: PGLUQuadric;
  5. begin
  6. //  BallCubeMap.Bind;
  7.   Renderpass01(cx, cy, cz);
  8.   quad := gluNewQuadric;
  9.   try
  10.     gluQuadricTexture(quad, True);
  11.     glPushMatrix(); // Matrix sichern
  12.     glTranslatef(cx,cy,cz);
  13.     gluSphere(quad, Radius, 32, 32);
  14.     glpopmatrix;
  15.   finally
  16.     gluDeleteQuadric(quad);
  17.   end;
  18. //  BallCubeMap.Unbind;
  19. end;
  20.  

letztenendes sehe ich nur unten ein feld in der größe von 256*256

aber ich vermute mal, da ist ne menge mehr falsch,
besonders beim anklatschen der textur, außerdem rufe ich den renderpass im rendering auf,
ich denke das muss davor, aber kA wie, gibts nirgends ne demo ?

reicht mir glaube ich einfach zu wissen, wie ich die 6 bilder hier rein bekomme:
Code:
  1.  
  2. CubeMap : array [0..5] of GLuint;
  3.  


ich glaube so sollte das dann gehen:
Code:
  1.  
  2.     // Assign The CubeMaps to the mesh defined below
  3.     glBindTexture(GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT,CubeMap[0]);
  4.     glBindTexture(GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT,CubeMap[1]);
  5.     glBindTexture(GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT,CubeMap[2]);
  6.     glBindTexture(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT,CubeMap[3]);
  7.     glBindTexture(GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT,CubeMap[4]);
  8.     glBindTexture(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT,CubeMap[5]);
  9.    
  10.     glEnable(GL_TEXTURE_CUBE_MAP_EXT);   // Start cube mapping
  11.     glEnable(GL_TEXTURE_GEN_S);          
  12.     glEnable(GL_TEXTURE_GEN_T);
  13.     glEnable(GL_TEXTURE_GEN_R);
  14.  
  15.     gluSphere(quad, Radius, 32, 32);
  16.  
  17.     glDisable(GL_TEXTURE_CUBE_MAP_EXT);     // Stop Cube Mapping
  18.     glDisable(GL_TEXTURE_GEN_S);
  19.     glDisable(GL_TEXTURE_GEN_T);
  20.     glDisable(GL_TEXTURE_GEN_R);
  21.  

nur verstehe ich den renderpass kram net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 08, 2006 18:22 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7804
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Wenn sich die Umgebung deiner Kugel nicht ändert, und die Szene "sehr groß" ist (idealerweise ein außenlevel) dann hast du recht. Die Cubemap könnte dann vor dem Renderloop einmalig erstellt werden. Falls aber einer der obigen Punkte nicht erfüllt ist, sollte die Cubemap alle paar renderschleifen aktualisiert werden (was verständlicherweise der performance Schaden würde).

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 08, 2006 18:23 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
ich glaube es würde bei mir reichen, die alle 0.5 sekunden zu berechnen, aber ich weiß net wie ^^ deshalb wollte ich die dann auch abspeichern


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 08, 2006 19:44 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
ok ich schon wieder, ich habe "noch" nicht aufgegeben:
Code:
  1.  
  2. procedure CreateScreenTexture(i: integer);
  3. var pTexData: Pointer;
  4. begin
  5.   // Speicher reservieren für eine 256x256 Textur
  6.   GetMem(pTexData, 256*256*3);
  7.  
  8.  
  9.   // Textur generieren und drauf zeigen
  10.   glGenTextures(1, cubemap[i]);
  11.   glBindTexture(GL_TEXTURE_2D, cubemap[i]);
  12.  
  13.   // Daten in den Speicher, Lineares Filtering aktivieren
  14.   glTexImage2D(GL_TEXTURE_2D, 0, 3, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, pTexData);
  15.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  16.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  17.  
  18.   // Freigeben
  19.   FreeMem(pTexData);
  20. end;
  21.  
  22. procedure Renderpass(cx, cy, cz: double; i: integer);
  23. begin
  24.   glEnable(GL_DEPTH_TEST);
  25.   glEnable(GL_TEXTURE_2D);
  26.  
  27.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  28.   glMatrixMode(GL_PROJECTION);
  29.   glLoadIdentity;
  30.   glViewPort(0, 0, 256, 256);
  31.   gluPerspective(90, 1, 0.1, 1000);
  32.  
  33.   glMatrixMode(GL_MODELVIEW);
  34.   glLoadIdentity;
  35.  
  36.   glTranslatef(cx, cy, cz);
  37.  
  38.   case i of
  39.     0: glRotatef(90, 0, 1, 0);
  40.     1: glRotatef(-90, 0, 1, 0);
  41.     2: glRotatef(90, 1, 0, 0);
  42.     3: glRotatef(-90, 1, 0, 0);
  43.     4: glRotatef(180, 0, 1, 0);
  44.     5: glRotatef(0, 0, 0, 0);
  45.   end;
  46.  
  47.   glpushmatrix;
  48.     DrawProc(true);  //True heißt "es ist ein renderpass"
  49.   glpopmatrix;
  50.  
  51.   glBindTexture(GL_TEXTURE_2D, cubemap[i]);
  52.   glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 256, 256, 0);
  53. end;
  54.  


jetzt ist es doch aber afaik so, dass die textur direkt gebindet und nicht gespeichert wird oder ?
ich hatte die gerade eben schon aus versehen woanders, aber im moment sehe ich nichts,
das liegt wohl daran, dass die textur nicht in cubemap[i] liegt, da möchte ich sie aber reinhaben,
nur wie stelle ich das an ? Oo lichter hab ich weggelassen, braucht man da wohl eher net.

und muss ich die texturen dann nicht noch spiegeln ? ich meine für die seiten horizontal
und für oben und untenhorizontal und vertikal ? soll ja eine spiegelnde kugel sein


mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 09, 2006 13:20 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
auch so funktioniert das ganze nicht:
Code:
  1.  
  2. procedure CreateScreenTexture(i: integer);
  3. var pTexData: Pointer;
  4. begin
  5.   // Speicher reservieren für eine 256x256 Textur
  6.   GetMem(pTexData, 256*256*3);
  7.  
  8.  
  9.   // Textur generieren und drauf zeigen
  10.   glGenTextures(1, cubemap[i]);
  11.   glBindTexture(GL_TEXTURE_2D, cubemap[i]);
  12.  
  13.   // Daten in den Speicher, Lineares Filtering aktivieren
  14.   glTexImage2D(GL_TEXTURE_2D, 0, 3, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, pTexData);
  15.   glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  16.   glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  17.  
  18.   // Freigeben
  19.   FreeMem(pTexData);
  20. end;
  21.  
  22. procedure Renderpass(cx, cy, cz: double; i: integer);
  23. begin
  24.   glEnable(GL_DEPTH_TEST);
  25.   glEnable(GL_TEXTURE_2D);
  26.  
  27.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  28.   glMatrixMode(GL_PROJECTION);
  29.   glLoadIdentity;
  30.   glViewPort(0, 0, 256, 256);
  31.   gluPerspective(90, 1, 0.1, 1000);
  32.  
  33.   glMatrixMode(GL_MODELVIEW);
  34.   glLoadIdentity;
  35.  
  36.   glTranslatef(cx, cy, cz);
  37.  
  38.   case i of
  39.     0: glRotatef(90, 0, 1, 0);
  40.     1: glRotatef(-90, 0, 1, 0);
  41.     2: glRotatef(90, 1, 0, 0);
  42.     3: glRotatef(-90, 1, 0, 0);
  43.     4: glRotatef(180, 0, 1, 0);
  44.     5: glRotatef(0, 0, 0, 0);
  45.   end;
  46.  
  47.   glpushmatrix;
  48.     DrawProc(true);
  49.   glpopmatrix;
  50.  
  51.   glBindTexture(GL_TEXTURE_CUBE_MAP, cubemap[i]);
  52.   glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB + i, 0, GL_RGB, 0, 0, 256, 256, 0);
  53. end;
  54.  


hat denn keiner eine lösung ? :cry:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 09, 2006 14:53 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2067
Programmiersprache: C++
Kurz und schmerzlos bevor ich weiterrum meckere:
glTexImage2D(GL_TEXTURE_2D, 0, 3, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, pTexData);
glBindTexture(GL_TEXTURE_CUBE_MAP, cubemap[i]);
Siehe: http://wiki.delphigl.com/index.php/Tutorial_Cubemap#Normalisierungscubemaps


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 09, 2006 14:58 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
eien etwas üppigere Beschreibung der symptome in wiefen es nicht funktioniert könnt schon nicht schaden.
Aber allgemein würde ich auf jedenfall empfehlen in der Prozedur CreateScreenTexture auch eine cubemap zu erstellen und die Bilder in die seiten zu laden. Dafür sollte die ID für die gesamte Cubemap gleich sein (also glGetTextures einmal für die gesamte cubemap aufgerufen werden) und der code zum binden und laden eher so aussehen:
Code:
  1.  
  2. glBindTexture(GL_TEXTURE_CUBE_MAP, cubemap[i]);
  3. // Daten in den Speicher, Lineares Filtering aktivieren
  4. glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB+i, 0, 3, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, pTexData);
  5.  


edit: arg, zu langsam


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 20 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.100s | 17 Queries | GZIP : On ]