Vor längerer Zeit hatte ich von Sascha einen Tipp bekommen, transparente, verschnittene Objekte mit Dual Depth Peeling zu rendern. NVidia hat dafür ein Beispielprojekt in C++ mit GLSL-Shadern http://developer.download.nvidia.com/SDK/10/opengl/samples.html. Das Projekt habe ich mir vorgenommen, von C nach Delphi übersetzt und die Shader so angepaßt, dass sie einigermaßen brauchbar sind.
Mein Ergebnis habe ich angehängt.
Gerne hätte ich einen kurzen Kommentar von euch dazu, insbesondere, wenn es nicht läuft. Ich weiß nicht, ob diese NVidia-Shader Probleme auf anderen Karten machen.
Registriert: Mi Dez 03, 2008 12:01 Beiträge: 167 Wohnort: /country/germany
Programmiersprache: C++ / FreeBASIC
Eine exe wäre nice, da ich selbst momentan kein Delphi installiert habe Wie stehts denn eigentlich mit der Geschwindigkeit? Beim nVidia-SDK hatte ich den Eindruck dass der ganze Spaß ziemlich langsam ist.
_________________ Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak
Hier die Exe. Für dies Forum ist die Datei zu groß.
Hinsichtlich der Geschwindigkeit habe ich mir noch keine Gedanken gemacht. Aus diesem einfachen Programm kann man nichts dahingehend ableiten. Guck einfach mal. Bitte beachte, beide Würfel sind transparent.
Fragment shader failed to compile with the following errors: ERROR: 0:12: error(#132) Syntax Error: 'DepthBlenderTex' parse error ERROR: error(#273) 1 compilation errors. No code generated
Error: Linkerror: One or more shaders are not compiled
(nochmal das gleiche für Shader ID 10, 14, 17, 20)
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Deine Shader müssen an die aktuellen Standards angepasst werden. Ich habs nurmal für dual_peeling_peel_fragment.glsl gemacht, müsste bei den anderen aber genauso aussehen :
- samplerRECT gibts nur in cG. In GLSL heisst der sampler2DRect - textureRect heisst in GLSL texture2DRect
Da hat bei frontColor dass xyz gefehlt, was falsch ist, da fronColor vier Komponenten hat und du ja nur drei beschreibst. Auf NV geht dass, aber laut specs nicht.
Dann funzen die Shader auch hier auf ner ATI und es sieht korrekt aus.
P.S. : Statt der ID bei ner Fehlermeldung wärs besser wenn du die Dateinamen der Shader ausgeben würdest, dass macht die Fehlersuche einfacher.
Die Kritikpunkte habe ich umgesetzt : - samplerRECT -> sampler2DRect - textureRect -> texture2DRect - frontColor -> frontColor.xyz
Das mit frontColor hätte ich nie gefunden. Mit textureRect habe ich irgendwie schon gerechnet, weil NVidia sich gerühmt hat, damit besonders schnell zu sein.
also habs mal auf meinem Laptop getestet.(ATI Mobility Radeon HD 3470, Windows 7)
Da bekomm ich beim Start ne MessageBox
In der Caption steht: Ddp
und als Message kommt: GL_INVALID_VALUE
Wenn ich die wegklicke geht die Form auf. Bei Standart passiert garnichts. Es wird nichts gerendert und wenn ich dann einen Anderen Menupunkt auswähle, bekomme ununtererbrochen die Nachricht, dass es eine Zugriffsverletzung bei 0000000C gibt, wobei ich denke, dass das mit dem Fehler, der vorher kommt, zusammenhänkt. Ich kann zwar Delphi programmieren, aber das habe seit 2 Jahren nicht mehr angerücht. Proge immer mit C++ und ich benutze Directx, kein OGL. Das heißt, ich kann dir bei der Fehlersuche nicht mehr weiterhelfen.
PS. Ich teste es morgen noch an meinem Pc, der hat ne Nvidea Geforce GTX 260. Mal kucken, was da rauskommt.
@Jonathan Danke für den Test. Auf der NVidia-Karte wird es laufen. Ich habe auch eine. Aber... ich habe jetzt noch eine Stelle mit einem NV-Einstellung gefunden, die wahrscheinlich inkompatibel ist. Bei den fbos :
Mit der Extension GL_ARB_texture_float kommt auch das interne Format GL_LUMINANCE_ALPHA32F_ARB. Die Daten liegen dort im roten Kanal bzw. im Alpha-Kanal.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Stimmt so nicht ganz, Coolcat. Im Gegensatz zu GL_FLOAT_RG32_NV können einige Karten GL_LUMINANCE_ALPHA32F_ARB nicht als Colorbuffer an einen FBO binden (meine zum Beispiel… ich musste auf ein RGBA-Format ausweichen, obwohl ich nur einen Kanal brauchte…). Gegebenenfalls muss man da dann schauen bei welchem ein Invalid Value fliegt bzw. wo das FBO ungültig wird und dann das jeweils andere nehmen.
greetings
_________________ 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
GL_EXT_framebuffer_object: The following base internal formats from table 3.15 are "color-renderable": RGB, RGBA, FLOAT_R_NV, FLOAT_RG_NV, FLOAT_RGB_NV, and FLOAT_RGBA_NV. The sized internal formats from table 3.16 that have a color-renderable base internal format are also color-renderable. No other formats, including compressed internal formats, are color-renderable.
GL_ARB_framebuffer_object: The following base internal formats from table 3.15 are <color-renderable>: ALPHA, LUMINANCE, LUMINANCE_ALPHA, INTENSITY, RED, RG, RGB, RGBA, FLOAT_R_NV, FLOAT_RG_NV, FLOAT_RGB_NV, and FLOAT_RGBA_NV. The sized internal formats from table 3.16 that have a color-renderable base internal format are also color-renderable. No other formats, including compressed internal formats, are color-renderable.
=> Wenn du mit GL_LUMINANCE_ALPHA32F_ARB in einen FBO der EXT-Extension rendern kannst ist das ein Fehler des Treibers
Die Extension GL_ARB_texture_float fügt GL_LUMINANCE_ALPHA32F_ARB der besagten Tabelle 3.16 hinzu, entsprechend sollte das gehen, wenn du GL_ARB_framebuffer_object benutzt statt der alten EXT-Variante. Probiert habe ich das ehrlich gesagt aber nicht. Wenn du nur einen Kanal brauchst solltest du entsprechend z.B. GL_ALPHA32F_ARB nutzen können.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Genau… Ich dachte ich erwähne das, weil der Poster von „Bei den fbos“ sprach .
greetings
_________________ 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
Also Coolcat, Deine Ausführungen sind für mich gerade etwas zu theoretisch.
Also Zusammenfassung: Die EXT Variante der FBO's akzeptiert (abgesehen von den Nvidia-Formaten) nur die Formate RGB und RGBA. Um also in eine Textur mit LUMINANCE_ALPHA Format zu rendern brauchst du die ARB-Variante der Extension.
Bei Verwendung des GL_LUMINANCE_ALPHA32F_ARB Formats statt GL_FLOAT_RG32_NV musst du im Shader .xy durch .xw ersetzen, da das Format ja nicht mehr Rot/Grün sondern Rot/Alpha enthält.
----
Übrigens der Aufruf von glBindFramebuffer statt glBindFramebufferEXT oder glBindFramebufferARB sagt mir das du überhaupt keine FBO-Extension benutzt. Ich vermute mal das ist mindestens ein OpenGL 3.0 Kontext? In dem Fall kannst du dir das ganze Extension-Gewusel sparen....die Float-Datentypen sind da schon Teil von OpenGL. Das gewünschte Format wäre dann wohl GL_RG32F und der FBO sollte auch darein rendern können.
Mitglieder in diesem Forum: 0 Mitglieder und 9 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.