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

Aktuelle Zeit: Do Jul 17, 2025 14:47

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



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Di Aug 24, 2004 15:23 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 16, 2003 15:20
Beiträge: 198
Ich versuche gerade für ein kleines Experiment mit Shadern eine 3 dimensionale Textur zu verwenden.
Leider sehe ich (auch bei deaktiviertem Shader) statt der Textur immer nur die aktuelle Color (mit glColor eingegeben).
Bis jetzt lade ich die Textur so (ist zwar alles andere als optimal, aber ist ja erstmal nur zu Testzwecken) :
Code:
  1.  
  2. type
  3.   T3Dtex = object
  4.     TexUnit : GLUInt;
  5.     Depth   : Cardinal;
  6.     procedure LoadfromFile(Filename : String);
  7.     procedure Free;
  8.   end;
  9.  
  10. implementation
  11.  
  12. type
  13.   TRGB = packed record
  14.     r,g,b : byte;
  15.   end;
  16.  
  17.   PRGB = ^TRGB;
  18.   Pbyte = ^Byte;
  19.  
  20.   T3DTexData = array[0..2,0..255,0..255]of TRGB;
  21.  
  22. procedure T3DTex.LoadfromFile(Filename : String);
  23.   function loadJPEG(filen : String):TBitmap;
  24.   var
  25.     JPG : TJPEGImage;
  26.   begin
  27.     JPG := TJPEGImage.Create;
  28.     JPG.LoadFromFile(filen);
  29.     result := TBitmap.Create;
  30.     result.Assign(JPG);
  31.     JPG.Free;
  32.   end;
  33. var
  34.   s     : TStrings;
  35.   x,y,z : Cardinal;
  36.   P     : T3DTexData;//der Einfachheit halber wird ein statisches Array verwendet
  37.   tmp   : TColor;
  38.   pointer : PByte;
  39.   b     : TBitmap;
  40.  
  41. begin
  42.   s := Tstringlist.Create;
  43.   s.LoadFromFile(Filename);
  44.   Depth := s.count;
  45.   if s.Count = 0 then
  46.     begin
  47.       exit;
  48.     end;
  49.  
  50.   b := LoadJPEG(s[0]);
  51.  
  52.   //erste Textur in den Speicher laden
  53.   for x := 0 to 255 do
  54.     for y := 0 to 255 do
  55.       begin
  56.         tmp := b.Canvas.Pixels[x,y];
  57.         pointer := @tmp;
  58.         inc(pointer);//Das erste Byte von Colors enthält keinen Farbwert, sondern System daten -> unnötig
  59.         p[0,x,y] := PRGB(pointer)^;
  60.       end;
  61.  
  62.   for z := 1 to 2 do
  63.     begin
  64.       b.Free;
  65.       b := LoadJPEG(s[z]);
  66.       for x := 0 to b.width-1 do
  67.         for y := 0 to b.height-1 do
  68.           begin
  69.             tmp := b.Canvas.Pixels[x,y];
  70.             pointer := @tmp;
  71.             inc(pointer);//Das erste Byte von Colors enthält keinen Farbwert, sondern System daten -> unnötig
  72.             p[z,x,y] := PRGB(pointer)^;
  73.           end;
  74.     end;
  75.  
  76.   //Textur in die Grafikkarte Laden
  77.   glEnable(gl_texture_3d);
  78.   glGenTextures(1,@TexUnit);
  79.   glbindtexture(gl_texture_3d,texunit);
  80.   glTExParameteri(GL_TEXTURE_3D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  81.   glTExParameteri(GL_TEXTURE_3D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  82.   glTexParameteri(GL_TEXTURE_3D,GL_TEXTURE_WRAP_S,GL_REPEAT);
  83.   glTexParameteri(GL_TEXTURE_3D,GL_TEXTURE_WRAP_T,GL_REPEAT);
  84.   glTexParameteri(GL_TEXTURE_3D,GL_TEXTURE_WRAP_R,GL_REPEAT);
  85.   glTexImage3D(GL_TEXTURE_3D,0,GL_RGB,256,256,3,0,GL_RGB,GL_UNSIGNED_BYTE,@P[0,0,0]);
  86.  
  87.   //Speicherfreigeben
  88.  
  89.   b.free;
  90. end;
  91.  
  92. procedure T3DTex.Free;
  93. begin
  94.   glDeleteTextures(1,@TexUnit);
  95. end;
  96.  

Ich muss wohl noch hinzufügen, dass die Textdatei, die mit s geladen wir 3 Dateipfade zu 3 JPGs enthält, die alle 256*256 Pixel groß sind.

Rendern tuhe ich das ganze dann so :
Code:
  1.  
  2. begin
  3.   glenable(gl_texture_3d);
  4.  
  5.   gldisable(gl_texture_2d);//Hab ich zur Sicherheit eingefügt, eigentlich unnötig
  6.  
  7.   glbindTexture(gl_texture_3d,tex.TexUnit);
  8.  
  9.   glbegin(gl_quads);
  10.     glColor3f(1,1,1);
  11.     gltexcoord3f(0,0,0);
  12.     glvertex2f(-1,-1);
  13.     glTexCoord3f(1,0,0);
  14.     glvertex2f( 1,-1);
  15.     glTexCoord3f(1,1,1);
  16.     glvertex2f( 1, 1);
  17.     glTexCoord3f(0,1,1);
  18.     glvertex2f(-1, 1);
  19.   glend;
  20. end;


Kann mir jemand verraten, was ich falschgemacht habe ? (Anmerkung : eine andere Anwendung, die 3D Texturen verwendet hat lief)

mfG
Thomas

_________________
Bevor du definierst, was etwas ist, versichere dich seiner Existenz.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 24, 2004 20:09 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Code:
  1. T3DTexData = array[0..2,0..255,0..255]of TRGB;


Das müsste eigentlich
Code:
  1. T3DTexData = array[0..255,0..255,0..2]of TRGB;

sein, weil zeilenweise (links nach rechts) von oben nach unten gelesen wird, und dann zum nächsten Slice gewechselt wird. Ansonsten sieht der Quellcode nämlich in Ordnung aus.

Aber eigentlich sollte man immer mittels glGetError prüfen ob alles korrekt geklappt hat, dann kommt man recht schnell einem Problem auf die Schliche.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 25, 2004 18:06 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 16, 2003 15:20
Beiträge: 198
Hab (dank dem Tip) den Fehler gefunden :
die Textur war 256*256*3 groß, was zwar an sich richtig, aber noch nicht zugelassen ist (nur zahlen die man durch 2^n erhalten kann sind erlaubt).

_________________
Bevor du definierst, was etwas ist, versichere dich seiner Existenz.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 25, 2004 19:19 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich hätte mal ne Verständnisfrage zu 3D Texturen:

:?: Was befindet sich in der 3. Dimension einer Textur!?
:?: Wie erstellt man 3D Texturen?
:?: Für was brauch man 3D Texturen?

(Wenn mir das jemand gut erklären kann, mach ich nen Wikieintrag draus. Oder man postet es gleich dort.)

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 25, 2004 19:33 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
3D Texturen werden meistens für volumetrische Daten (oft in der Medizin) verwendet, allerdings spielt es im Endeffekt keine Rolle was denn in der dritten Dimension ist, also kann man die auch für andere Sachen wie z.B. Animationen nutzen, wo jedes Slice nen Animationsframe darstellt. Das macht man z.B. um (da die GPU das noch nicht kann) animierte 3D-Noise zu "simulieren". Aber wie gesagt bist du bei den Dimensionen einer 3D-Textur frei, da kann man alles reinpacken was man will, und eben erwähnte Fälle sind nur Beispiele.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 25, 2004 19:48 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Gibt es spezielle Formate die eine dritte Dimension unterstützen, oder lädst du einfach mehrere 2D texturen in eine 3D Textur?

Das mit den Animationen klingt durchaus interessant...gibts da hier ein beispiel dazu? (Was zum angucken wär Cool. Ein fertigen Code... :D *WieÜblich*)

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 25, 2004 20:24 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
@Format :
DDS kann auch Volumentexturen speichern, allerdings mit einigen Einschränkungen. Aber meistens werden volumetrische Daten eh zur Laufzeit erstellt.

@Animation :
Kenne da eigentlich keins, aber ich glaub im NVidia SDK (oder zumindest auf deren Entwicklerseite) gabs sowas.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 25, 2004 21:17 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Man kann da eigentlich jede Funktion mit 3 Parameter drin speichern. Besonders da man ja auch fp32 und fp16 Gleitkommaformate mit 3D Texturen benutzen kann.
Auf GF3/4 Karten kann man z.B. eine 3D Texture benutzen um den Helligkeitsverlauf der Lichtintensität zu speichern. Dann setzt man mit gltexgen und der Texturematrix die 3 Ebenen so, daß der Mittelpunkt der Texture beim Licht ist, stellt clamp ein und kann ohne Bumpmapping immerhin bis zu 4 Lichter auf solchen alten Karten darstellen.
Heutzutage muß man abwegen ob es sich unter Umständen nicht eher lohnt die Funktionen direkt im Shader zu berechnen, aber in so einer Texture kann man ja auch Werte speichern, die sich nicht so ohne weiteres berechnen lassen, oder die man direkt kontrollieren möchte. Daher können 3D Texturen auch heutzutage noch nützlich sein. Humus hat z.B. eine Demo bei der eine 3D Lightmap berechnet wird und die Texture dann die Schatten enthält.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 26, 2004 16:50 
Offline
DGL Member

Registriert: Fr Dez 19, 2003 14:27
Beiträge: 107
Wohnort: Indianapolis, USA
Humus hat auch ein Demo (Fire 2) welches die animierten Partikel in einer 3d Textur ablegt damit zwischen den animationsframes interpoliert wird und somit die animation smoother aussieht.


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


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 7 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.009s | 15 Queries | GZIP : On ]