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

Aktuelle Zeit: Fr Jul 18, 2025 14:53

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



Ein neues Thema erstellen Auf das Thema antworten  [ 27 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: Sa Mär 05, 2011 20:42 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
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.


Dateianhänge:
DepthPeeling.zip [190.02 KiB]
533-mal heruntergeladen
Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Mär 05, 2011 20:56 
Offline
DGL Member
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Mär 05, 2011 21:37 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Mär 06, 2011 02:26 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Dez 03, 2008 12:01
Beiträge: 167
Wohnort: /country/germany
Programmiersprache: C++ / FreeBASIC
Sieht ganz gut aus ;)
Auf meiner GTX 460 läufts wunderbar.

_________________
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Mär 06, 2011 10:15 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Mär 06, 2011 10:25 
Offline
DGL Member
Benutzeravatar

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

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.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Mär 06, 2011 14:16 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mär 07, 2011 01:17 
Offline
DGL Member

Registriert: Di Sep 07, 2010 14:28
Beiträge: 34
Wohnort: Frankfurt
Programmiersprache: C++,C#,VB(,Delphi)
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.

_________________
Das mit dem Dx tut mir leid.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mär 07, 2011 12:48 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
@Jonathan
Danke für den Test.
Auf der NVidia-Karte wird es laufen. Ich habe auch eine. :wink:
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?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mär 07, 2011 13:02 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mär 07, 2011 13:21 
Offline
DGL Member
Benutzeravatar

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 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  
BeitragVerfasst: Mo Mär 07, 2011 13:53 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mär 07, 2011 14:03 
Offline
DGL Member
Benutzeravatar

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 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  
BeitragVerfasst: Mo Mär 07, 2011 14:09 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
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);
...


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mär 07, 2011 14:46 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 27 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 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.010s | 16 Queries | GZIP : On ]