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;
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 network • my 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
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.
Da hab ich genau 3 Ganzzahlen mehr im Endergebnis! Do-It-Yourself-Normierung
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
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.
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?
_________________ 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....
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:
void main(void)
{
int Ergebnis;
// Irgendwelche Inhalte in Ergebnis schreiben
Ergebnis = 129;
Ergebnis += 123;
Ergebnis -= 200;
Ergebnis = Ergebnis * 2;
// Fertig
gl_FragColor.r = (float(Ergebnis)/65535.0);
}
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 network • my 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
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....
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....
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.
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...
_________________ 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....
Mitglieder in diesem Forum: Bing [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.