.[ ČeskéHry.cz ].
Depth peeling

 
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
Khaj



Založen: 16. 01. 2008
Příspěvky: 49

PříspěvekZaslal: 26. leden 2008, 10:58:31    Předmět: Depth peeling Odpovědět s citátem

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 Question Zavolam normalne
vector starahloubka = tex2D(Hloubka, p.xy /*in p:VPOS*/);
a ktera komponenta toho vektoru je ona hloubka Question A jak je tam hloubka ulozena - jako procentualni vzdalenost mezi near a far plane nebo ... Question (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
Zobrazit informace o autorovi Odeslat soukromou zprávu
quas4



Založen: 18. 10. 2007
Příspěvky: 199

PříspěvekZaslal: 26. leden 2008, 11:39:16    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Khaj



Založen: 16. 01. 2008
Příspěvky: 49

PříspěvekZaslal: 26. leden 2008, 12:44:02    Předmět: Odpovědět s citátem

Diky moc Very Happy . 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 Smile .

[/code]
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
quas4



Založen: 18. 10. 2007
Příspěvky: 199

PříspěvekZaslal: 26. leden 2008, 17:34:57    Předmět: Odpovědět s citátem

Khaj napsal:
Diky moc Very Happy . Jenom bych jeste poprosil o kontrolu jestli jsem to spravne prevedl do directX-HLSL:


to bouzel nemuzu. HLSL vubec neznam.
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