Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
mafian89
Založen: 21. 10. 2012 Příspěvky: 51
|
Zaslal: 24. prosinec 2013, 14:37:21 Předmět: OpenGL - SSAO artefakt |
|
|
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 |
|
|
Vilem Otte
Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 24. prosinec 2013, 17:04:47 Předmět: |
|
|
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 |
|
|
mafian89
Založen: 21. 10. 2012 Příspěvky: 51
|
Zaslal: 24. prosinec 2013, 23:34:12 Předmět: |
|
|
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 |
|
|
mafian89
Založen: 21. 10. 2012 Příspěvky: 51
|
Zaslal: 27. prosinec 2013, 23:37:00 Předmět: |
|
|
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 |
|
|
Mivoj
Založen: 11. 12. 2012 Příspěvky: 32
|
Zaslal: 11. listopad 2014, 17:21:15 Předmět: |
|
|
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 |
|
|
Vilem Otte
Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 12. listopad 2014, 20:39:20 Předmět: |
|
|
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 |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 13. listopad 2014, 13:49:31 Předmět: |
|
|
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 |
|
|
|