Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Khaj
Založen: 16. 01. 2008 Příspěvky: 49
|
Zaslal: 26. leden 2008, 10:58:31 Předmět: Depth peeling |
|
|
Po prostudovani vsemoznych materialu o teto technice mi hlavou vrta par otazek:
Pro peeling do hloubky n vrstev si vytvorim n krat CreateDepthStencilSurface, abych u kazde vrstvy vedel i po skonceni procesu jeji hloubku (jinak by stacily 2 zejo). No a kdyz tenhle povrch nastavim jako texturu (= druhy potrebny depth test budu provadet shaderem), tak jak pak v tom shaderu zjistim tu hloubku Zavolam normalne
vector starahloubka = tex2D(Hloubka, p.xy /*in p:VPOS*/);
a ktera komponenta toho vektoru je ona hloubka A jak je tam hloubka ulozena - jako procentualni vzdalenost mezi near a far plane nebo ... (potrebuju vedet pro "rekonstrukci" puvodni pozice pixelu abych ho mohl vynasobit matici kamery na minus prvni a pak matici pohledu svetla a ziskal koordinaty na shadowmape) |
|
Návrat nahoru |
|
|
quas4
Založen: 18. 10. 2007 Příspěvky: 199
|
Zaslal: 26. leden 2008, 11:39:16 Předmět: |
|
|
nejak takto (glsl):
kód: |
uniform sampler2D depth_tex;
uniform float near_z;
uniform float far_z;
void main()
{
vec2 screen_pos = vec2(gl_FragCoord.x / 640.0, gl_FragCoord.y / 480.0);
vec4 depth = texture2D(depth_tex, vec2(gl_FragCoord.x / 640.0, 1.0 - gl_FragCoord.y / 480.0));
float a = far_z / (far_z - near_z);
float b = far_z * near_z / (near_z - far_z);
float r_depth = b / (depth.z - a);
// -> r_depth je nekde v rozmezi near_z - far_z (odpovida "realne" hloubce)
...
...
}
|
Fragment predpoklada ze okno (i depth_tex) maji rozliseni 640x480. Dale ze hodnoty v depth bufferu jsou v <0, 1>, tj. glDepthRange(0, 1);
Parametry near_z/far_z jsou vzdalenosti (clip-planes) napr. u gluPerspective(). Fragment neni samozrejme nijak optimalizovany.
Problemem je ze vyrobci karet nektere veci obcas ignoruji takze jsou nutne i mensi variace mezi verzemi driveru a vyrobcu. Napr. y-flip v texture2D(depth_tex,..) je u nekterych verzi driveru potreba zrusit (v linuxovych driverech fglrx starsich nez 2.1.7059).. |
|
Návrat nahoru |
|
|
Khaj
Založen: 16. 01. 2008 Příspěvky: 49
|
Zaslal: 26. leden 2008, 12:44:02 Předmět: |
|
|
Diky moc . Jenom bych jeste poprosil o kontrolu jestli jsem to spravne prevedl do directX-HLSL:
kód: |
sampler2D DepthTex:register(s0);
matrix InverzeProj:register(c0);
//------- pro porovnavani delky:----------
void main(ScrP:VPOS/*....*/)
{
//...
vector depth = texture2D(DepthTex, ScrP.xy);
if (ScrP.z<=depth.z)// je bliz nez predchozi vrstva
discard; // nechceme
//....
}
//------ Pro zjisteni pozice pixelu:--------
void main(ScrP:VPOS/*....*/)
{
//...
vector depth = texture2D(DepthTex, ScrP.xy);
vector Pos.xy=ScrP.xy;
Pos.z=depth.z;
Pos=Pos*InverzeProj;
/* Je tedy pravda, ze ted mam teda pozici pixelu s platnymi xyz koordinaty v objectspace ? */
//....
}
|
Predpokladejme ze si nehraju s matici viewportu (o ktere sem se dozvedel ze se aplikuje sama mimo vertex shader a tudiz dela vetsinou jenom bordel) a ze chapu dobre, ze VPOS je skutecne od nuly do jedny .
[/code] |
|
Návrat nahoru |
|
|
quas4
Založen: 18. 10. 2007 Příspěvky: 199
|
Zaslal: 26. leden 2008, 17:34:57 Předmět: |
|
|
Khaj napsal: |
Diky moc . Jenom bych jeste poprosil o kontrolu jestli jsem to spravne prevedl do directX-HLSL:
|
to bouzel nemuzu. HLSL vubec neznam. |
|
Návrat nahoru |
|
|
|
|
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