.[ ČeskéHry.cz ].
OpenGL - SSAO artefakt

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
mafian89



Založen: 21. 10. 2012
Příspěvky: 51

PříspěvekZaslal: 24. prosinec 2013, 14:37:21    Předmět: OpenGL - SSAO artefakt Odpovědět s citátem

Zdravím,

zkouším implementovat SSAO (podle http://www.gamerendering.com/2009/01/14/ssao/). Zdá se, že všechno funguje jako má až na jednu věc. Jedná se o to, že ve středu obrazovky se mi "vytváří" soustředné kružnice (nevím, jak to popsat, obrázek snad napoví).



Neví někdo, čím by to mohlo být způsobeno? (SSAO texturu zatím nerozmazávám).

Dekuji moc za pomoc a přeji hezké vánoce a štastný Nový rok.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vilem Otte



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

PříspěvekZaslal: 24. prosinec 2013, 17:04:47    Předmět: Odpovědět s citátem

Velice pravděpodobně jde o nepřesnost bufferu do kterého ukládáš hloubku.
_________________
Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
mafian89



Založen: 21. 10. 2012
Příspěvky: 51

PříspěvekZaslal: 24. prosinec 2013, 23:34:12    Předmět: Odpovědět s citátem

Vilem Otte: Díky za odpověď, ráno se na to kouknu. Aktuálně mám hloubku v alfa kanálu v GL_RGBA16F textuře.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
mafian89



Založen: 21. 10. 2012
Příspěvky: 51

PříspěvekZaslal: 27. prosinec 2013, 23:37:00    Předmět: Odpovědět s citátem

Tak s těma kružnicema jsem pohnul, nicméně mě teďka trápí jiný problém. Mám v shaderu funkci:
kód:
float computeSSAO(sampler2D normal_tex, sampler2D random_tex) {
   const vec3 pSphere[10] = vec3[](..//10 vektrorů)
   vec3 fres = normalize((texture(random_tex,texCoord*offset).xyz*2.0) - vec3(1.0));
   vec4 currentPixelSample = texture(normal_tex,texCoord);
   float currentPixelDepth = currentPixelSample.a;
   vec3 ep = vec3(texCoord.xy,currentPixelDepth);
   vec3 norm = currentPixelSample.xyz;
   float bl = 0.0;
   float radD = rad/currentPixelDepth;
   vec3 ray, se, occNorm;
   float occluderDepth, depthDifference, normDiff;
   for(int i=0; i<SAMPLES;++i)
   {
      ray = radD*reflect(pSphere[i],fres);
      se = ep + sign(dot(ray,norm) )*ray;
      vec4 occluderFragment = texture(normal_tex,se.xy);
      occNorm = occluderFragment.xyz;
      depthDifference = currentPixelDepth-occluderFragment.a;
      normDiff = (1.0-dot(occNorm,norm));
      bl += step(falloff,depthDifference)*normDiff*(1.0-smoothstep(falloff,strength,depthDifference));
   }
   return 1.0-totStrength*bl*invSamples;
}


Ta způsobí na výstupu následující (pokud nepoužiji výše uvedenou funkci, tak se to neobjevuje - je to zmenšená "textura" šumu..):


V kódu v aplikaci:
kód:

glViewport(0,0,width,height);
   glBindFramebuffer(GL_FRAMEBUFFER, fboManagerBloomSsao->getFboId());
   glActiveTexture(GL_TEXTURE0);
   glBindTexture(GL_TEXTURE_2D, texManager["render_tex"]);
   glActiveTexture(GL_TEXTURE1);
   glBindTexture(GL_TEXTURE_2D, texManager["normal_tex"]);
   glActiveTexture(GL_TEXTURE2);
   glBindTexture(GL_TEXTURE_2D, texManager["noise_tex"]);
   glActiveTexture(GL_TEXTURE3);
   glBindTexture(GL_TEXTURE_2D, texManager["position_tex"]);
   bloomSsaoShader.Use();
      glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
      glUniform1i(bloomSsaoShader("render_tex"),0);
      glUniform1i(bloomSsaoShader("normal_tex"),1);
      glUniform1i(bloomSsaoShader("random_tex"),2);
      glUniform1i(bloomSsaoShader("position_tex"),3);
      //...dalsi uniformy
      glBindBuffer(GL_ARRAY_BUFFER, screenQuadVBO);
      glEnableVertexAttribArray(bloomSsaoShader["vPosition"]);
      glVertexAttribPointer(bloomSsaoShader["vPosition"],  3, GL_FLOAT, GL_FALSE, sizeof(screenQuad), NULL);
      glDrawArrays(GL_TRIANGLE_STRIP,0,4);
   bloomSsaoShader.UnUse();
   glBindTexture(GL_TEXTURE_2D, NULL);
   glBindFramebuffer(GL_FRAMEBUFFER,0);


Omlouvám se delší post, ale opravdu nevím, co by to mohlo způsobovat. Nenapadá někoho něco? Díky moc!
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Mivoj



Založen: 11. 12. 2012
Příspěvky: 32

PříspěvekZaslal: 11. listopad 2014, 17:21:15    Předmět: Odpovědět s citátem

No využiji tohoto vlákna, abych nezakládal zbytečně další a chcu se zeptat zdali se dá vytvořit efekt podobný SSAO i v klasickém forward renderingu?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vilem Otte



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

PříspěvekZaslal: 12. listopad 2014, 20:39:20    Předmět: Odpovědět s citátem

Ano, dá.

Nicméně stejně potřebuješ depth a normal buffer (ideálně skrz render target).

Technicky vzato ti ale stačí depth buffer (ale SSAO s depth bufferem mi vždycky přišlo hůře vypadající než i s použitím normál).

Nakonec provedeš forward rendering a aplikuješ u toho SSAO.
_________________
Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
pcmaster



Založen: 28. 07. 2007
Příspěvky: 1824

PříspěvekZaslal: 13. listopad 2014, 13:49:31    Předmět: Odpovědět s citátem

A) nebude to strasne drahe? Takto si to asi nemyslel, co?

1. Vyrenderovat depth (+ normal) buffer -- dost vysoka cena, pretoze musis samplovat alpha-masky aj normal/bump textury
2. Kreslit normalne forward (depth-equal test) a na kazdom pixli samplovat tieto buffery pre vypocet AO

Ten druhy krok bude oproti samostatnemu vypoctu SSAO full-screen textury pomalsi z mnohych dovodov -- 2x2 quad efficiency, caches, ...

B) Pripadne takto?
1. depth + normal buffer
2. forward (depth-equal test)
3. compute + apply SSAO

C) Pripadne takto?
1. depth + normal buffer
2. compute SSAO
3. forward + apply SSAO
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna