Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
Hi, ich hab eine kurze Frage an die Gurus hier.
Ich habe mich bisher nie großartig um Texturformate gekümmert, da ich sonst nur mit GL_RGBA oder GL_DEPTH_COMPONENT gearbeitet habe. Nun ist es aber so, dass ich versuche SSAO zu implementieren und dazu gerne eine vorgenerierte "Noise"-Textur und einen SampleKernel als Textur im Shader verarbeiten will. Diese sollen als GL_RG32F und GL_RGBA32F vorliegen, da die NoiseTextur 2 Floats für die Kernelrotation vorhalten soll und der Kernel selbst eine 1D-Textur ist, in der die Vektoren der zu untersuchenden Punkte abgelegt sind. Alle Werte befinden sich im Wertebereich -1.0 bis 1.0. Jetzt steht in der Spezifikation von OpenGL 4.x, dass die Werte alle auf 0-1 geclampt werden. trifft das auch auf die von mir gewählten Formate zu? Wie würde der Aufruf von TexImage2D/1D aussehen, wenn ich ein Array von 4Float bzw. 2Float in die Textur schreiben will?
Bevor ich jetzt stundenlang im Kreis programmiere, würde ich gerne das Thema etwas durchleuchtet haben, da mir auch noch nach etlichen Forensuchen immer noch nicht genau klar ist, was da eigentlich intern passiert.
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,
was genau dort intern passiert kann ich dir leider nicht sagen, aber ich würde mich da einfach an die Spec halten (dafür is sie ja da). Wenn du den Kernel-Daten in die Textur lädst, dann konvertier die Daten vorher, das sie im Bereich von 0-1 liegen: Value = (Value + 1.0) / 2.0; Und genau die umgedrehte Operation machst du dann im Shader, nachdem du die Daten aus der Textur gelesen hast: Value = (texture(sampler, coord).rgba * 2.0) - 1.0; Das ist zwar minimal mehr Rechenaufwand, aber das macht die Grafik-Karte mit links und du bist Spec-konform.
Ne andere Möglichkeit wäre es, das einfach mit einem kleinen Test-Programm auszuprobieren (mach ich auch öfters). Einfach ne Textur mit den Daten -1.0, 0.0 und 1.0 und dann im Shader: gl_FragColor = (texture(sampler, coord).rgba + 1.0) / 2.0; Wenn du da jetzt einen scharzen, einen grauen und einen weißen Pixel hast, dann können Float Texturen -1.0 bis 1.0, wenn nicht, dann hast du 2 graue und einen weißen Pixel. Aber wie oben schon gesagt würde ich da lieber nach Spec arbeiten.
Registriert: So Aug 08, 2010 08:37 Beiträge: 460
Programmiersprache: C / C++ / Lua
Und wenn du dann beim Konvertieren der -1…1 Werte nach 0…1 Probleme kriegst, weil es zu ungenau ist, musst du halt Doubles nehmen. Eine andere Möglichkeit fiele mir direkt nicht ein.
_________________ offizieller DGL Compliance Beauftragter Never run a changing system! (oder so)
Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
Ich hab die Vektoren jetzt einfach in den Wertebereich 0.0 - 1.0 gemappt, das klappt ganz gut. Der SSAO-Shader macht jetzt zwar noch anderweitig Probleme, aber Kernel und Noise kommen richtig an.
Mitglieder in diesem Forum: 0 Mitglieder und 16 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.