DGL https://delphigl.com/forum/ |
|
transparente Objekte mit Dual Depth Peeling rendern https://delphigl.com/forum/viewtopic.php?f=20&t=9780 |
Seite 1 von 2 |
Autor: | Jens01 [ Sa Mär 05, 2011 20:42 ] | ||
Betreff des Beitrags: | transparente Objekte mit Dual Depth Peeling rendern | ||
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.
|
Autor: | darkinsanity [ Sa Mär 05, 2011 20:56 ] |
Betreff des Beitrags: | Re: transparente Objekte mit Dual Depth Peeling rendern |
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. |
Autor: | Jens01 [ Sa Mär 05, 2011 21:37 ] |
Betreff des Beitrags: | Re: transparente Objekte mit Dual Depth Peeling rendern |
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. http://rapidshare.com/files/451104712/DDP.zip Hier überlappen sich die transparenten Würfel. Ich glaube, das ist der entscheidene Unterschied zu ohne DDP. http://rapidshare.com/files/451105807/DDP.zip |
Autor: | darkinsanity [ So Mär 06, 2011 02:26 ] |
Betreff des Beitrags: | Re: transparente Objekte mit Dual Depth Peeling rendern |
Sieht ganz gut aus ![]() Auf meiner GTX 460 läufts wunderbar. |
Autor: | sharkman [ So Mär 06, 2011 10:15 ] |
Betreff des Beitrags: | Re: transparente Objekte mit Dual Depth Peeling rendern |
Zitat: Error: shader-Compiler-Error ShaderID: 6 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) Shader is not ready ATI Radeon HD 5570 Catalyst 8.801, 25-Nov-10 |
Autor: | Sascha Willems [ So Mär 06, 2011 10:25 ] |
Betreff des Beitrags: | Re: transparente Objekte mit Dual Depth Peeling rendern |
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 Und in dann noch Code: gl_FragColor.rgb = frontColor.xyz + backColor * alphaMultiplier; 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. |
Autor: | Jens01 [ So Mär 06, 2011 14:16 ] |
Betreff des Beitrags: | Re: transparente Objekte mit Dual Depth Peeling rendern |
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. http://rapidshare.com/files/451202453/DDP.zip Wenn jemand noch mal auf Ati bzw <> NVidia testen könnte, wäre das nett. |
Autor: | Jonathan [ Mo Mär 07, 2011 01:17 ] |
Betreff des Beitrags: | Re: transparente Objekte mit Dual Depth Peeling rendern |
hi 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. Gruß Willi. |
Autor: | Jens01 [ Mo Mär 07, 2011 12:48 ] |
Betreff des Beitrags: | Re: transparente Objekte mit Dual Depth Peeling rendern |
@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 : Code: glTexImage2D(GL_TEXTURE_RECTANGLE, 0, GL_FLOAT_RG32_NV, g_imageWidth, g_imageHeight, 0, GL_RGB, GL_FLOAT, 0); Das GL_FLOAT_RG32_NV ist nur für NV-Karten. Weiß jemand, wie man das ersetzen kann? |
Autor: | Coolcat [ Mo Mär 07, 2011 13:02 ] |
Betreff des Beitrags: | Re: transparente Objekte mit Dual Depth Peeling rendern |
Zitat: Das GL_FLOAT_RG32_NV ist nur für NV-Karten. Weiß jemand, wie man das ersetzen kann? 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. |
Autor: | Lord Horazont [ Mo Mär 07, 2011 13:21 ] |
Betreff des Beitrags: | Re: transparente Objekte mit Dual Depth Peeling rendern |
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 |
Autor: | Coolcat [ Mo Mär 07, 2011 13:53 ] |
Betreff des Beitrags: | Re: transparente Objekte mit Dual Depth Peeling rendern |
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. |
Autor: | Lord Horazont [ Mo Mär 07, 2011 14:03 ] |
Betreff des Beitrags: | Re: transparente Objekte mit Dual Depth Peeling rendern |
Genau… Ich dachte ich erwähne das, weil der Poster von „Bei den fbos“ sprach ![]() greetings |
Autor: | Jens01 [ Mo Mär 07, 2011 14:09 ] |
Betreff des Beitrags: | Re: transparente Objekte mit Dual Depth Peeling rendern |
Also Coolcat, Deine Ausführungen sind für mich gerade etwas zu theoretisch. So ist das bei mir (bzwNVidia) deklariert: Code: glGenTextures(2, @g_dualDepthTexId); for i := 0 to 1 do begin glBindTexture(GL_TEXTURE_RECTANGLE, g_dualDepthTexId[i]); glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexImage2D(GL_TEXTURE_RECTANGLE, 0, GL_FLOAT_RG32_NV, imageWidth, g_imageHeight, 0, GL_RGB, GL_FLOAT, 0); end; ... glBindFramebuffer(GL_FRAMEBUFFER, g_dualPeelingSingleFboId); j := 0; glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_RECTANGLE, g_dualDepthTexId[j], 0); ... j := 1; glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT3, GL_TEXTURE_RECTANGLE, g_dualDepthTexId[j], 0); Das ganze wird in dem Shader als DepthBlenderTex übergeben. Und hier die Stelle im Shader : Code: #extension ARB_draw_buffers : require
uniform sampler2DRect DepthBlenderTex; uniform sampler2DRect FrontBlenderTex; #define MAX_DEPTH 1.0 void main(void) { // window-space depth interpolated linearly in screen space float fragDepth = gl_FragCoord.z; vec2 depthBlender = texture2DRect(DepthBlenderTex, gl_FragCoord.xy).xy; vec4 forwardTemp = texture2DRect(FrontBlenderTex, gl_FragCoord.xy); ... |
Autor: | Coolcat [ Mo Mär 07, 2011 14:46 ] |
Betreff des Beitrags: | Re: transparente Objekte mit Dual Depth Peeling rendern |
Zitat: 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. |
Seite 1 von 2 | Alle Zeiten sind UTC + 1 Stunde |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |