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

Aktuelle Zeit: Mi Jul 16, 2025 23:12

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



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Mär 11, 2005 17:23 
Offline
DGL Member

Registriert: Fr Nov 12, 2004 14:58
Beiträge: 76
Wohnort: Aachen
Salut,

ich lade mir ein Datenfile (Single Array) und wandele das dann in eine Textur um.
Wenn ich nur ein Wert übergebe, und das als GL_ALPHA deklariere sehe ich auch das richtige.

Übergebe ich aber 4 Werte und sage GL_RGBA, dann sehe ich nur einen winizgen Ausschnitt meiner Textur, den aber 4 mal.

Kennt jemand das Problem ???

Anbei mal ein winziges Programm, das genau dieses macht. Die zwei Datenfiles sind einfach so als File of Single weggeschrieben, da ich nicht die ganzen Klassen etc. mit anhängen wollte.

Grüße

Wolf


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
Ein Schiff im Hafen ist sicher. Aber dafür werden Schiffe nicht gebaut. (Engl. Sprichwort)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mär 12, 2005 11:14 
Offline
DGL Member

Registriert: Fr Nov 12, 2004 14:58
Beiträge: 76
Wohnort: Aachen
Also,
nachdem ich das Array mal nicht Row-Major sondern Column-Major abgespeichert habe, habe ich einen schwarzen Block, einen weissen Block einen schwarzen Block und den Alpha-Kanal meiner Textur gesehen. Also speichere ich das prinzipiell schon in der richtigen Reihenfolge.
Meine Vermutung ist die folgende: GL_RGBA erwartet pro Wert 16 Bits = 2 Byte. Wenn ich das richtig im Kopf habe, dann hat ein Single aber 4 Byte, also 32 Bits.

Bleiben ein paar Sachen, die ich nicht verstehe:
(a) Wieso funktioniert es dann beim GL_ALPHA ?
(b) Warum sehe ich nur eine Ecke, die 4x und nur im untersten Bereich ?
(c) Gibt es einen 16Bit Fliesskomma-Wert in Delphi ?

[Edit]
Aber laut IEEE ist Float = 32Bit und laut OpenGL Spec ist GL_FLOAT = Float
[/Edit]

Grüße

Wolf

_________________
Ein Schiff im Hafen ist sicher. Aber dafür werden Schiffe nicht gebaut. (Engl. Sprichwort)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mär 12, 2005 12:14 
Offline
DGL Member

Registriert: Fr Nov 12, 2004 14:58
Beiträge: 76
Wohnort: Aachen
Problem gelöst.

Es lag tatsächlich an der falschen Array-Adressierung

ich habe folgende Schleife benutzt, um das Array zu adressieren:

Code:
  1.  
  2.   for j := 0 to Dimensions['y']-1 do
  3.     for i := 0 to Dimensions['x']-1 do begin
  4.       if @_ColorMap <> nil then begin
  5.         tmpColor := _ColorMap(Data[i,j,_Slice],MinVal,MaxVal);
  6.         Result[j*Dimensions['x']+(i*4)+0] := tmpColor.Red;
  7.         Result[j*Dimensions['x']+(i*4)+1] := tmpColor.Green;
  8.         Result[j*Dimensions['x']+(i*4)+2] := tmpColor.Blue;
  9.         Result[j*Dimensions['x']+(i*4)+3] := tmpColor.Alpha;
  10.       end else
  11.         Result[j*Dimensions['x']+i] := Data[i,j,_Slice]/MaxVal;
  12.     end;
  13.  


Richtig ist aber die folgende Schleife
Code:
  1.  
  2.   for j := 0 to Dimensions['y']-1 do
  3.     for i := 0 to Dimensions['x']-1 do begin
  4.       if @_ColorMap <> nil then begin
  5.         tmpColor := _ColorMap(Data[i,j,_Slice],MinVal,MaxVal);
  6.         Result[(j*Dimensions['x']+i)*4+0] := tmpColor.Red;
  7.         Result[(j*Dimensions['x']+i)*4+1] := tmpColor.Green;
  8.         Result[(j*Dimensions['x']+i)*4+2] := tmpColor.Blue;
  9.         Result[(j*Dimensions['x']+i)*4+3] := tmpColor.Alpha;
  10.       end else
  11.         Result[j*Dimensions['x']+i] := Data[i,j,_Slice]/MaxVal;
  12.     end;
  13.  


Warum ?
Deswegen (Beispiel mit Dimensions['x']=Dimensions['y']=3)
Code:
  1.  
  2.             j*Dimensions['x']+(i*4)+0           (j*Dimensions['x']+i)*4+0          
  3. J   I       Falsch                          Richtig        
  4.             R   G   B   A               R   G   B   A
  5. 0   0    0  1   2   3               0   1   2   3
  6. 0   1    4  5   6   7               4   5   6   7
  7. 0   2    8  9   10  11          8   9   10  11
  8. 1   0    3  4   5   6               12  13  14  15
  9. 1   1    7  8   9   10              16  17  18  19
  10. 1   2   11  12  13  14          20  21  22  23
  11. 2   0    6  7   8   9               24  25  26  27
  12. 2   1   10  11  12  13          28  29  30  31
  13. 2   2   14  15  16  17          32  33  34  35
  14.  


Das heißt, mit den Daten, die ich Euch gegeben habe, kann man den Fehler nicht finden.

Trotzdem danke an alle, die sich das angeschaut haben.

[Edit]
Sorry wegen der Tabelle, sollte hoffentlich trotzdem einigermassen lesbar sein.
[/Edit]

Grüße

Wolf

_________________
Ein Schiff im Hafen ist sicher. Aber dafür werden Schiffe nicht gebaut. (Engl. Sprichwort)


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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.007s | 14 Queries | GZIP : On ]