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

Aktuelle Zeit: So Jul 20, 2025 18:40

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Okt 04, 2007 11:32 
Offline
DGL Member

Registriert: Sa Sep 29, 2007 18:43
Beiträge: 38
Wohnort: STR / BLN / LAU
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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 04, 2007 14:28 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
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

_________________
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 Okt 04, 2007 14:40 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 04, 2007 15:29 
Offline
DGL Member

Registriert: Sa Sep 29, 2007 18:43
Beiträge: 38
Wohnort: STR / BLN / LAU
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:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 05, 2007 10:14 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
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.

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 05, 2007 12:35 
Offline
DGL Member

Registriert: Sa Sep 29, 2007 18:43
Beiträge: 38
Wohnort: STR / BLN / LAU
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?

_________________
Tu es oder tu es nicht!
Tu es hier und jetzt oder tu es nicht hier und jetzt!
Aber tu niemals etwas und denke du würdest es lieber nicht tun....


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 05, 2007 17:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
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

_________________
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: Sa Okt 06, 2007 09:04 
Offline
DGL Member

Registriert: Sa Sep 29, 2007 18:43
Beiträge: 38
Wohnort: STR / BLN / LAU
Aha, jetzt hab ich es geschnallt.
THX...Have a nice weekend...!

_________________
Tu es oder tu es nicht!
Tu es hier und jetzt oder tu es nicht hier und jetzt!
Aber tu niemals etwas und denke du würdest es lieber nicht tun....


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 02, 2007 08:31 
Offline
DGL Member

Registriert: Sa Sep 29, 2007 18:43
Beiträge: 38
Wohnort: STR / BLN / LAU
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

_________________
Tu es oder tu es nicht!
Tu es hier und jetzt oder tu es nicht hier und jetzt!
Aber tu niemals etwas und denke du würdest es lieber nicht tun....


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 02, 2007 10:39 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 03, 2007 09:15 
Offline
DGL Member

Registriert: Sa Sep 29, 2007 18:43
Beiträge: 38
Wohnort: STR / BLN / LAU
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:

_________________
Tu es oder tu es nicht!
Tu es hier und jetzt oder tu es nicht hier und jetzt!
Aber tu niemals etwas und denke du würdest es lieber nicht tun....


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 » Shader


Wer ist online?

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