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

Aktuelle Zeit: Mi Mai 15, 2024 16:28

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



Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 
Autor Nachricht
 Betreff des Beitrags: DeferredShading + SSAO Performance
BeitragVerfasst: Do Jul 28, 2011 15:40 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
Moinsen,

ich habe zu meiner DFS Pipeline noch SSAO hinzugefügt. Ich berechne bei mir die Position nur durch die Tiefentextur. Aber im SSAO Shader muss ja für jedes Pixel mehrfach die Position errechnen...

Und hier gibts gleich nochn kostenlosen SSAO Shader 8)
Code:
  1.  
  2. uniform sampler2D Tex0, Tex1, Tex2;
  3. uniform vec2 screenSize;
  4. float random_size =64.0; // size of random texture
  5.  
  6.  
  7. uniform mat4 proM;
  8. uniform mat4 InvViewMat;
  9. uniform float zFar;
  10. uniform float SampleRad;
  11. uniform float Intensity;
  12. uniform float Scale;
  13. uniform float Bias;
  14.  
  15. vec3 GetDFSpos(vec2 uv)
  16. {
  17.     float fDepth = texture2D(Tex2, uv).x;  
  18.    
  19.         vec4 vVertex;      
  20.         vVertex.xy = uv  * 2.0 - 1.0 ;                         
  21.         vVertex.z = fDepth * 2.0 - 1.0;  
  22.         vVertex.w = 1.0;
  23.         vVertex =  proM * vVertex;               
  24.         vVertex *= 1.0 / vVertex.w;
  25.         return  vVertex.xyz ;
  26. }
  27.  
  28. float calcAO(vec2 uv, vec2 coord, vec3 pos, vec3 norm)
  29. {
  30.     vec3 diff = GetDFSpos(uv + coord).xyz - pos;
  31.     vec3 v = normalize(diff);
  32.     float d = length(diff) * Scale;
  33.     return max(0.0, dot(norm, v) - Bias) * (1.0 / (1.0 + d)) * Intensity;
  34. }
  35.  
  36. void main(void)
  37. {
  38.     vec2 rand;
  39.     vec3 n;
  40.  
  41.     vec2 vec[4];
  42.     vec[0] = vec2(1, 0);
  43.     vec[1] = vec2(-1, 0);
  44.     vec[2] = vec2(0, 1);
  45.     vec[3] = vec2(0, -1);
  46.     vec2 uv = gl_TexCoord[0].st;
  47.        
  48.     vec2 randomMap = texture2D(Tex0, vec2(screenSize) * uv / random_size).xy;
  49.     vec3 normalMap = texture2D(Tex1, uv).xyz;
  50.  
  51.     vec3 pos = GetDFSpos(uv);
  52.  
  53.     n = (normalMap * 2.0 - 1.0);
  54.     rand = normalize(randomMap * 2.0 - 1.0);
  55.    
  56.     float ao = 0.0;
  57.     float rad = SampleRad / pos.z;
  58.    
  59.  
  60.     int iterations = int(mix(4.0, 1.0, -pos.z / zFar));
  61.     for (int i = 0; i < iterations; ++i) {
  62.         vec2 coord1 = reflect(vec[i], rand) * rad;
  63.         vec2 coord2 = vec2(coord1.x * 0.707 - coord1.y * 0.707, coord1.x * 0.707 + coord1.y * 0.707);
  64.        
  65.         ao += calcAO(uv, coord1 * 0.25, pos, n);
  66.         ao += calcAO(uv, coord2 * 0.5, pos, n);
  67.         ao += calcAO(uv, coord1 * 0.75, pos, n);
  68.         ao += calcAO(uv, coord2, pos, n);  
  69.     }
  70.          
  71.     ao /= float(iterations) * 4.0;
  72.    
  73.     gl_FragColor = vec4(1.0-ao);
  74. }
  75.  


Nun frage ich mich obs nicht doch besser is eine richtige Positionstextur in eine 32 Bit Texture zu packen... Aktuell merk ich noch keine Performance einbussen, doch es kommt ja noch (viel) mehr...


Hier noch schnell meine 2. Frage:
Hinzu kommt jetzt noch das wichtigste für meine Engine.. das Sonnenlicht (mit Schatten). Ich frage mich nun ob ich das auch gleich über die DFS Pipeline machen sollte oder per Pixel. Die DFS Daten hab ich ja schon vorliegen.. Die Frage ist allerdings ob das Sonnenlicht nicht schneller berechnet ist (sofern keine andere Lampe da is) wenn ichs über normale Pipeline berechne..


EDIT und hier noch ein schönes bildchen vom Resultat:
Dateianhang:
ssao.JPG


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.027s | 17 Queries | GZIP : On ]