.[ ČeskéHry.cz ].
Obnova pozice z hloubky
Jdi na stránku 1, 2  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 14. listopad 2011, 10:31:44    Předmět: Obnova pozice z hloubky Odpovědět s citátem

Zdravím,

mám problém s obnovením pozice z uložených hloubek v depth mapě.

Uložení hloubky v shaderech:
kód:

VS:
Output.viewPos = mul(float4(Input.posFromApp, 1), mul(xWorld, xView));

PS:
float depth = Input.viewPos.z / xClipPlanesFar;   



Rekonstrukce:
Aplikace:
kód:

- získám rohy view-frustra ve World Space
- rohy far roviny transformuju do View Space (Vector3 corner = Vector3::Transform(corner, viewMatrix)
- 4 získané vrcholy pošlu do shaderu


Shader:
kód:

VS:
Output.cornerPos = mul(xFarFrustrumCorners[cornerIndex], (float3x3)xViewInv);

PS:
float3 posWS = cameraPos + depth * Input.cornerPos;


Problém je, že pos není ve world space... když nastavim podmínku
kód:
if (posWS.x <10) return RED;

tak se mi vybarvuje prostor stejně "náhodně" podle toho, jak točím kamerou

Nápad jsem převzal z tutoriálu, překontroloval postup na papíru a přijde mi korektní. View Matici mám na 99% dobře (používám jí všude a nikde nic neblbne)
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 14. listopad 2011, 11:58:00    Předmět: Odpovědět s citátem

mám to takhle (hloubka je lineární):

Uložení:
kód:

VS:
vec4 pos = Vertex * ModelViewProjMatrix;
depth = pos.w / CameraFar;


Rekonstrukce:
kód:
VS:
vec4 farClipPoint = ViewProjMatrixInverse * vec4(in_Position.x, in_Position.y, 1.0, 1.0); // in_Position je od -1 do 1
WorldFar = farClipPoint.xyz  / farClipPoint.w;      

PS:
vec3 worldPosPS = mix(CameraPos, WorldFar, depth);//mix je lerp, v glsl



EDIT: V tvém případě: jak interpoluješ ty rohy frusta? Ve vertex shaderu?
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 14. listopad 2011, 16:32:57    Předmět: Odpovědět s citátem

Nechávám to interpolovat PS.. stejným způsobem jako interpoluje texturovací souřadnice. Takhle to bylo v tom článku

Ty to uchováváš z projekčním, já ve view prostoru, ale to by tomu nemělo vadit.
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 14. listopad 2011, 19:28:30    Předmět: Odpovědět s citátem

Tak nevím...jsou ty vrcholy frusta vpořádku? Třeba nějak tak, jak sem psal:

kód:
p = ViewProjMatrixInverse * vec4(-1.0, -1.0, 1.0, 1.0);
frustumFar1 = p.xyz  / p.w;     
p = ViewProjMatrixInverse * vec4( 1.0, -1.0, 1.0, 1.0);
frustumFar2 = p.xyz  / p.w;     
p = ViewProjMatrixInverse * vec4( 1.0,  1.0, 1.0, 1.0);
frustumFar3 = p.xyz  / p.w;     
p = ViewProjMatrixInverse * vec4(-1.0, -1.0, 1.0, 1.0);
frustumFar4 = p.xyz  / p.w;     


A nebo posčítat pár vektorů z matice kamery a přičíst pozici...
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 14. listopad 2011, 19:32:41    Předmět: Odpovědět s citátem

Ty vrcholy frusta se dají spočítat ze screen-aligned quadu. Jelikož každej vertex je v rohu, můžeš z nich udělat vektory pro frustum. Stačí k tomu akorát matice pohledu nebo možná jen inverzní projekční, teď si to z hlavy přesně nepamatuju.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 14. listopad 2011, 19:36:33    Předmět: Odpovědět s citátem

To jsem psal taky, ale perry to chce asi vyřešit pro ty rohy z aplikace...
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 14. listopad 2011, 20:13:46    Předmět: Odpovědět s citátem

No ty rohy toho quadu by imho měli být dobře...to jsou ty rohy far stěny frustra, které namapuju na full-screen quad. Ty rohy posílám do VS v view space, tam každý roh transformuju zpět do world space


Vrcholy frustra (aka. rohy toho quadu) počítám:
kód:

//Far plane
corners = {
MyMath::Vector4(-1, -1, 1, 1), //E
MyMath::Vector4( 1, -1, 1, 1), //F
MyMath::Vector4( 1,  1, 1, 1), //G      
MyMath::Vector4(-1,  1, 1, 1), //H
}

MyMath::Matrix4x4 viewProjInv = MyMath::Matrix4x4::Invert(this->viewProj);

MyMath::Vector3 * corners = new MyMath::Vector3[4];
float invW;
for (int i = 0; i < 4; i++)
{
cornersVector4[i] = MyMath::Vector4::Transform(cornersVector4[i], viewProjInv);
      
invW = 1.0f / cornersVector4[i].W;
corners[i].X = cornersVector4[i].X * invW;
corners[i].Y = cornersVector4[i].Y * invW;
corners[i].Z = cornersVector4[i].Z * invW;
}

//ted mam corners ve world space
//-----
//transformuju rohy do view space
....
farCornersVS[i] = MyMath::Vector3::TransformNormal(corners[i], this->camera->GetViewMatrix());
//transformNormal bere submatici 3x3 z view matice... nicméne když vezmu celou, tak je to blbe taky



Ty shadery jsou pak jako v prvním postu (resp. ty řádky co jsou relevantní k tomuhle)
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 15. listopad 2011, 10:12:37    Předmět: Odpovědět s citátem

Myslím, že potřebuješ poslat do shaderu ty rohy frusta ve world space , ale s odečtenou pozicí kamery (místo ve view space). Teprve pak bych řekl, že tohle:

kód:
PS:
float3 posWS = cameraPos + depth * Input.cornerPos;


může spočítat pozici ve World Space.
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 15. listopad 2011, 11:26:43    Předmět: Odpovědět s citátem

Do shaderu je pošlu ve View space... a v shaderu je pak transformuju inverzni matici pro view space, takže je dostanu do world space.

Když si vypisuju rohy frustra ve WS, tak jsou dobře.. po transformaci do VS to vypadá taky dobře (pokud provedu plnou transformaci vč. translační složky, mám near rovinu cca. kolem 0,0,0; když provedu transformaci submaticí 3x3, tak se pozice near roviny rozhází a neodpovídá už WS)

Když je pošlu rovnou ve WS, tak to nefunguje taky... Navíc to nejde ani debugovat, abych viděl zda ty shadery opravdu počítají co mají, protože PIX s deferred renderingem nějak nefunguje :/
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 15. listopad 2011, 11:48:53    Předmět: Odpovědět s citátem

pošli je do shaderu ve World Space, ale s odečtenou pozicí kamery
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 15. listopad 2011, 12:14:00    Předmět: Odpovědět s citátem

To jsem zkoušel... pořád to má stejný problém (viz. video)
http://www.youtube.com/watch?v=Ao83hLMJk78

Modré by to mělo být jenom pro x < 10.. přičemž [0,0,0] je v levém rohu.

Když tam tu pozici pošlu jak jsi řikal, tak se to chová cca. stejně jako když ji pošlu ve VS a do WS ji transformuju až ve Vertex Shaderu

Postup mi přijde OK.. teď už mi jediný napadá, že se prostě data pošlou blbě do shaderu .. nějaký nápad v čem to debugovat, když PIX nefunguje a mám jen jedno GPU (takže NSight taky nejde) ?
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 15. listopad 2011, 13:09:53    Předmět: Odpovědět s citátem

Ono stejně nezáleží, v kterým prostoru to je, jestli world space nebo view space. Podstatný je, aby všechny vektory, ze kterých se pozice rekonstruuje, byly ve stejným prostoru. Pak dostaneš pozici v tom prostoru, v jakým byly ty vektory.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 15. listopad 2011, 19:21:02    Předmět: Odpovědět s citátem

Tak už jsem to vyřešil.. matematika byla dle předpokladu OK.. chyba byla plnění dat do shaderu...

pole
kód:
float3 corners[4]
to plnilo 12x hodnoty jako by bylo pole float4

Stejný kód pod DX9 mi fungoval s třídou Effect, teď jsem pod DX11 a mám shaderu ručně.. takže to bude asi tím, že to ten Effect nějak interně řešil
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
pcmaster



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

PříspěvekZaslal: 16. listopad 2011, 09:31:44    Předmět: Odpovědět s citátem

A preco nepouzivas s DX11 ten oficialny Effects11 framework? Imho je super! Ak sa divis, kam zmizol, tak jedine co musis spravit je zobrat ho z oficialneho samplu a dat do vlastneho projektu (musi sa (staticky) kompilovat) a je to, je na to sample. Kazdopadne ta od podobnych veci uplne neochrani Smile
_________________
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
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 16. listopad 2011, 10:07:23    Předmět: Odpovědět s citátem

Ten "oficiální" Effect framework pro dx11 je dost pochybný Smile Nikdy se mi tam nepodařilo zprovoznit shared proměnné, tak jsem to vzdal
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
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