| Zobrazit předchozí téma :: Zobrazit následující téma |
| Autor |
Zpráva |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 14. listopad 2011, 10:31:44 Předmět: Obnova pozice z hloubky |
|
|
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 |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 14. listopad 2011, 11:58:00 Předmět: |
|
|
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 |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 14. listopad 2011, 16:32:57 Předmět: |
|
|
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 |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 14. listopad 2011, 19:28:30 Předmět: |
|
|
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 14. listopad 2011, 19:32:41 Předmět: |
|
|
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 |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 14. listopad 2011, 19:36:33 Předmět: |
|
|
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 |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 14. listopad 2011, 20:13:46 Předmět: |
|
|
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 |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 15. listopad 2011, 10:12:37 Předmět: |
|
|
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 |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 15. listopad 2011, 11:26:43 Předmět: |
|
|
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 |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 15. listopad 2011, 11:48:53 Předmět: |
|
|
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 |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 15. listopad 2011, 12:14:00 Předmět: |
|
|
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 15. listopad 2011, 13:09:53 Předmět: |
|
|
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 |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 15. listopad 2011, 19:21:02 Předmět: |
|
|
Tak už jsem to vyřešil.. matematika byla dle předpokladu OK.. chyba byla plnění dat do shaderu...
pole
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 |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 16. listopad 2011, 09:31:44 Předmět: |
|
|
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  _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
| Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 16. listopad 2011, 10:07:23 Předmět: |
|
|
Ten "oficiální" Effect framework pro dx11 je dost pochybný Nikdy se mi tam nepodařilo zprovoznit shared proměnné, tak jsem to vzdal _________________ Perry.cz |
|
| Návrat nahoru |
|
 |
|