DGL
https://delphigl.com/forum/

Addition in Fragment Shader mit ganzen Zahlen
https://delphigl.com/forum/viewtopic.php?f=20&t=6962
Seite 1 von 1

Autor:  Daniellus [ Do Okt 04, 2007 11:32 ]
Betreff des Beitrags:  Addition in Fragment Shader mit ganzen Zahlen

Hallo,
hab schon wieder eine neue Herausforderung!
Ich rendere immernoch in eine Output-Textur mit Format UINT.

ich möchte vereinfacht folgendes im Shader tun:

gl_FragColor.r = beliebigerWertAusTextur + 3;

ich kann aber nur normierte float-werte von 0.0 bis 1.0 Addieren
also zum Bsp.:

gl_FragColor = beliebigerWertAusTextur + 0.5;

Wenn beliebigerWertAusTextur = 0 ist.
Dann ist 0.5 die zahlenmäßige Hälfte des Formates meiner Output-Textur.
In der Output-Textur steht dann 32767. Das macht Sinn!
Aber ich kann doch jetzt keine Tabelle anlegen, wo ich mir die entsprechenden normierten float-werte für die Ganzzahl hole.
Ganzzahlen multiplizieren klappt ohne Probleme. Das verstehe ich wiederum nicht!
Also --> gl_FragColor.r = beliebigerWertAusTextur*3;

Gibt es da 'nen Trick?

Autor:  Lord Horazont [ Do Okt 04, 2007 14:28 ]
Betreff des Beitrags: 

Probiers mal mit Gemütlichkeit ähm demda: :wink:

gl_FragColor.r = beliebigerWertAusTextur + (3/MaximalwertDesGewünschtenDatentyps)

letzterer könnte z.B. 65535 sein, wenn du nen normalen 16-Bit-Word hast. Das sollte gehen. So hast du, wenn du den höchsten Wert addierst, genau 1.0, das sollte deinem Wunschergebnis entsprechen.

Gruß Lord Horazont

Autor:  Lossy eX [ Do Okt 04, 2007 14:40 ]
Betreff des Beitrags: 

Würde auch sagen, dass es womöglich direkt gehen könnte. Wenn der Compiler schlau genug ist dann macht er daraus direkt eine Floatkonstante.

Anderenfalls wäre es auch möglich, dass du eine zusätzliche Textur erstellst. Also mit einem 32 Bit Float Kanal. In dem kannst du dann jeweils den entsprechenden Werte ablegen. Eine Größe von 256x256 genügt um 65536 Pixel (Werte) zu speichern. In dem Shader könntest du dann anhand der Texturkoordinaten dann auf einzelne Werte zugreifen. Das sollte man aber nicht übertreiben weil die Shader ab einer gewissen Anzahl von Texturzugriffen langsam werden können. Bei kleineren Mengen gehen auch 1D Texturen die dann einem Array ziemlich gleich sind + Kostenloser Interpolation (wenn gewünscht).


Aber mal etwas am Rande. Du willst ja mathematische Berehnungen auf der GPU durchführen. Von NVidia und von ATI gibt es jeweils APIs mit denen man solche Berechnungen mehr oder minder direkt durchführen kann. Ich weiß leider nicht mal mehr ansatzweise wie die beiden Teile heißen und welche Vorraussetzungen sie haben.

Autor:  Daniellus [ Do Okt 04, 2007 15:29 ]
Betreff des Beitrags: 

Jawoll, gute Idee...!
Es funktioniert mit float-werten!
Mit int addiert er 0, also nix.

gl_FragColor.r = beliebigerWertAusTextur + (3.0/65535.0)

Da hab ich genau 3 Ganzzahlen mehr im Endergebnis! Do-It-Yourself-Normierung 8)


Zum Thema GPGPU Toolkits von Nvidia und ATI:

Es wäre viel zu einfach, sich ins gemachte Nest zu setzen....Nein nur Spaß.
Ich hab das alles unter die Lupe genommen.
NVidia's CUDA (Compute Unified Device Architecture) und ATI's CTM (Close To Metal) sind für meine Zwecke entworfen, allerdings ist CTM nur mit Assembler programmierbar und CUDA läuft nur mit Nvidia-Karten. Außerdem soll das Ganze noch nicht so ausgereift sein, da es noch ziemlich in den Kinderschuhen steckt. Es sollte alles auch so unabhängig wie möglich entwickelt werden um sich späteren Gegebenheiten anzupassen oder es eben leicht auf andere Systeme zu portieren.
Der Allerdings größte Faktor für die Entscheidung dies mit OpenGL 2.0 und GLSL zu tun war und ist QNX.
Das fertige Produkt soll auf QNX laufen. OpenGL ES (Embedded System) 2.0 wird offiziell von QNX unterstützt.
Außerdem prügel ich mich lieber mir meinen eigenen Bugs rum als andere zu entdecken und nichts dagegen tun können :wink:

Autor:  The-Winner [ Fr Okt 05, 2007 10:14 ]
Betreff des Beitrags: 

Oder wenn du kompliziertere operationen auf den ints durchführen willst, am anfang des shaders einmal mit deiner gewünschren Farbtiefe multiplizieren, am ende dividieren.

Autor:  Daniellus [ Fr Okt 05, 2007 12:35 ]
Betreff des Beitrags: 

The-Winner hat geschrieben:
Oder wenn du kompliziertere operationen auf den ints durchführen willst, am anfang des shaders einmal mit deiner gewünschren Farbtiefe multiplizieren, am ende dividieren.


Das erläutere bitte etwas, ich verstehe es nicht.
Warum soll ich meinen Wert am Anfang des Shaders mit einem Faktor erweitern um ihn dann am Ende des Shaders wieder weg dividieren?

Bsp:
berechneterWert = (beliebigerWert*(2^16-1) + intWert1 ) / (2^16-1)

Meinst du das so?

Autor:  Lord Horazont [ Fr Okt 05, 2007 17:18 ]
Betreff des Beitrags: 

Er meint, dass du dein Ergebnis erstmal als Int zwischenspeichert. Z.B. so

Code:
  1.  
  2. void main(void)
  3. {
  4.   int Ergebnis;
  5.   // Irgendwelche Inhalte in Ergebnis schreiben
  6.   Ergebnis = 129;
  7.   Ergebnis += 123;
  8.   Ergebnis -= 200;
  9.   Ergebnis = Ergebnis * 2;
  10.   // Fertig
  11.  
  12.   gl_FragColor.r = (float(Ergebnis)/65535.0);
  13. }
  14.  


Sollte das ganze 1. Performanter und 2. Übersichtlicher machen, da du in deinem Code nur Ints verwendest und die später in floats "konvertierst".

Gruß Lord Horazont

Autor:  Daniellus [ Sa Okt 06, 2007 09:04 ]
Betreff des Beitrags: 

Aha, jetzt hab ich es geschnallt.
THX...Have a nice weekend...!

Autor:  Daniellus [ Fr Nov 02, 2007 08:31 ]
Betreff des Beitrags: 

Hallo,

bin zufällig auf eine Extension gestoßen, welche es mir erlaubt nicht normierte integer in einer textur zu übergeben und im shader damit zu arbeiten. erfordert OpenGL 2.0
vielleicht brauch es ja mal jemand...


Extension: EXT_integer_texture

Autor:  Lossy eX [ Fr Nov 02, 2007 10:39 ]
Betreff des Beitrags: 

Daniellus: Du meinst GL_EXT_texture_integer. Und OpenGL 2.0 stimmt als Anforderung leider nur halb. Diese Extension wurde mir der Geforce 8 eingeführt und ist derzeit auch nur auf solchen verfügbar.

Autor:  Daniellus [ Sa Nov 03, 2007 09:15 ]
Betreff des Beitrags: 

GL_EXT_texture_integer ist natürlich richtig und die genannten Beschränkungen bestehen auch.
Gut das jemand aufpasst, sonst hätte ich noch jmd. anderen in die Irre geführt... :wink:

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/