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: 1. únor 2014, 20:24:15 Předmět: Voda - bug |
|
|
Už dva dny řeším nějakou stupidní chybu a nevidím jí.
Na obrázku je čisté zrcadlo. Žlutá kostka je ozrcadlená. TO očividně nějak funguje. Problém je ten "bordel" na zadní straně (jakoby za tou kostkou). Ten tam nemá co dělat
Pro clipping používám Oblique projection a pro projekci textury potom
VS:
kód: |
void main()
{
gl_Position = CalcPositionInWorld(POSITION);
vPos.xyz = CalcPositionWS(POSITION);
vPos.w = 1.0;
vPos = vPos * en_mTextureProj;
vTexCoord = TEXCOORD0.xy;
}
|
PS:
kód: |
void main()
{
vec2 vTexCoord2 = vec2( vec2(0.5, 0.5) * (vPos.xy / vPos.ww) + vec2(0.5, 0.5));
gl_FragColor.rgb = texture2D( tex_reflection, vTexCoord2 ).rgb;
gl_FragColor.a = 1.0;
}
|
Výpočet projekční matice pro texturu
kód: |
en_mTextureProj = ReflectionMatrix * camera_view * camera_proj; |
ReflectionMatrix počítám podle tohoto: http://msdn.microsoft.com/en-us/library/windows/desktop/bb205356%28v=vs.85%29.aspx
Nemá někdo nějaký tip, co by mohlo být blbě ? Jestli mám blbě spočtenou tu oblique projekce (ale to jsem několikrát kontroloval a zdá se mi to OK), nebo mám blbě pak výslednou projekci textury na "quad"
Pravděpodobně to bude nějaká totální kravina, ale čím víc do toho koukám, tím víc mě to začíná štvát
Díky moc _________________ Perry.cz |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 1. únor 2014, 20:45:25 Předmět: |
|
|
Jen tak mimochodem, to co renderuješ do FBO, je celá kostka a nebo kostka řízlá rovinou vody? Připadá mi, že se do té vody promítá celá ta kostka jen vzhůru nohama, pak bych se nedivil, že tam vznikne takovýto artefakt... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 1. únor 2014, 21:32:52 Předmět: |
|
|
Poněkud komické, že na otázku ohledně vody odpovídá VODA. _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 1. únor 2014, 22:27:53 Předmět: |
|
|
Kostka by měla být řízlá rovinou vody. Okole je terén a ten je řízlý (by "oko" se zdá že OK). Podobné artefakty pak tvoří ale i ten terén
Měl jsem stejnou implementaci v DX a tam to fungovalo. Upravil jsem oblique projekci aby odpovídala projekční matici OpenGL. Takže jediný co zbývá je tak matice mirror (ReflectionMatrix), kterou mám podle toho msdn. Když jsem jí zkusil vyměnit za jinou mirror matici, tak to ale šlo do háje celé.
Zkusím ještě jednou pro jistotu přepočítat tu oblique matici, jestli jsem se při přepisování z DX někde neuklepnul.
I když teď me napadá, jestli já debil nedal vodu do výšky A a clip plane do výšky B... zítra se na to musím podívat, to by totiž byla ultra dementní chyba _________________ Perry.cz |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 1. únor 2014, 22:34:41 Předmět: |
|
|
Já tedy nevím, ale podle mě, by se to, co je pod hladinou (oranžová část kostky) neměla vykreslovat do FBO, kterou pak promítáš... protože jak to pak přezrcadlíš, budeš tam mít vidět i tu druhou stranu (tak jako na tvém obrázku) vlivem perspektivní projekce...
A vlastně nevím, proč to tak komplikuješ, prostě při renderování kostky do textury, nastav kameru na odvrácené straně roviny vody, bod pohledu rovněž invertuj podle roviny vody a orientaci kamery udělej vzhůru nohama... pak jen vyrenderuj a promítni do geometrie vody... trivka... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
Vilem Otte
Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 2. únor 2014, 00:09:37 Předmět: |
|
|
Řekl bych, že říznutí není provedeno správně - přesvědči se, zda se skutečně řeže krychle rovinou, nebo ne (dle mého se neřeže, pozor na samotné transformace krychle).
Artefaktů u terénu se lze taky zbavit, je to však o něco obtížnější. _________________ Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration. |
|
Návrat nahoru |
|
|
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 2. únor 2014, 08:56:45 Předmět: |
|
|
Tak první chyba byla přesně jak jsem říkal. Clip plane a skutečná výška hladiny byly nastaveny jinak cca. o 0.1 Terén je teď bez artefaktů, ale kostka je pořád divně , jako by se právě vůbec neclipnula. Přitom matice používá stejné jako terén _________________ Perry.cz |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 2. únor 2014, 15:05:36 Předmět: |
|
|
Co takhle vykreslit si ten framebuffer na obrazovku? Docela rád bych viděl, co v té textuře je...
Stejně si myslím, že je to přesně to, o čem jsme s Vilemem mluvili... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 2. únor 2014, 15:42:22 Předmět: |
|
|
Pokud udělám čistě clipping pomocí oblique matice bez zrcadlení, mám tohle:
Jakmile přidám zrcadlo, dostanu tohle
Jak to počítám:
Zrcadlo podle tohodle: http://msdn.microsoft.com/en-us/library/windows/desktop/bb205356%28v=vs.85%29.aspx (to by mělo fungovat, pokud kreslím čistě zrcadlený terén, je to OK)
Oblique Clipping matice:
kód: |
RH projekční matice:
Matrix4x4 m = Matrix4x4();
float yScale = 1.0f / tan(fovY / 2.0f);
float xScale = yScale / aspecRatio;
float depth = zFar - zNear;
m.M[0][0] = xScale;
m.M[1][1] = yScale;
m.M[2][2] = -(zFar + zNear) / depth;
m.M[2][3] = -1;
m.M[3][2] = -(2 * zFar * zNear) / depth;
Výpočet oblieq projekce:
Matrix4x4 tmp = Matrix4x4::Invert(mirror * viewMatrix);
tmp.Transpose();
Vector4 clipPlane = Vector4(0, 1, 0, -waterHeight);
clipPlane = clipPlane.Transform(tmp);
float xSign = (clipPlane.X > 0) ? 1.0f : ((clipPlane.X < 0) ? -1.0f : 0.0f);
float ySign = (clipPlane.Y > 0) ? 1.0f : ((clipPlane.Y < 0) ? -1.0f : 0.0f);
MyMath::Vector4 q;
q.X = xSign / this->matrices.projectionMatrix.M[0][0];
q.Y = ySign / this->matrices.projectionMatrix.M[1][1];
q.Z = 1.0f / this->matrices.projectionMatrix.M[2][3];
q.W = (1.0f / this->matrices.projectionMatrix.M[3][2]) +
(this->matrices.projectionMatrix.M[2][2] / (this->matrices.projectionMatrix.M[2][3] * this->matrices.projectionMatrix.M[3][2]));
float a = (2.0f * this->matrices.projectionMatrix.M[2][3] * q.Z) / Vector4::Dot(clipPlane, q);
Vector4 m3 = clipPlane * a;
m3.Z = m3.Z + this->matrices.projectionMatrix.M[2][3];
Matrix4x4 res = this->matrices.projectionMatrix;
res.M[0][2] = m3.X;
res.M[1][2] = m3.Y;
res.M[2][2] = m3.Z;
res.M[3][2] = m3.W;
res = oblique projection matrix
|
V shaderu pak počítám finální matici přes:
kód: |
(mirror * view) * obliqProj * world |
V DX mám stejný kód s LH maticí a běží to OK. Pokud ten výpočet q vektoru použiju v DX, je to OK (pak akorát musím upravit m3.Z a yvnechat 2.0, protože DX má clipping na [0, 1]) _________________ Perry.cz |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 2. únor 2014, 15:58:31 Předmět: |
|
|
Co Ti na tohle mám napsat, ptal jsem se na FBO, dostal jsem fuj matici.
Kdybych tohle dělal já, tak použiju klasické clip roviny z fixní, kameru si také natočím jen úpravou "z" souřadnic (position, lookat, top) podle roviny vody... děláš to zbytečně moc složité a komplikované.
Takže nejprve říznu všechno pod hladinou a vykreslím do FBO geometrii z pohledu "pod hladinou". Pak vykreslím geometrii bez řezaní, z normálního pohledu. Nakonec vykreslím quad vody s promítlou FBO texturou.
Je to tak triviální, otázka 20 minut... vyser se na nějakou Oblique matici (nebo jak tomu vlastně nadáváš). _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 2. únor 2014, 16:03:34 Předmět: |
|
|
Clipping roviny jsou mi k ničemu, když je GLES (a ani WebGL) nemá.
FBO obsah jsem postoval taky.. to jsou ty první dva obrázky _________________ Perry.cz |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 2. únor 2014, 16:11:53 Předmět: |
|
|
No tak to je poněkud nahovno...
Důvod, proč používám GL2, možná byly některé věci pomalé, ale pracovalo se s tím rychle a hlavně to fungovalo...
Pokud ty dva obrázky jsou FBO, tak jsou podle mě špatně... ten pohled by měl být přece "pod hladinou", takhle to vypadá, že to renderuješ ze stejného pohledu, jako scénu...
A jinak, jak vůbec provádíš renderování toho quadu vody? Někdy mi musíš ukázat na kompu, jak to tam máš nabastlené... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 2. únor 2014, 16:33:44 Předmět: |
|
|
Tak už se mi podařilo to opravit
Tady
kód: |
m3.Z = m3.Z + this->matrices.projectionMatrix.M[2][3]; |
musí být
kód: |
m3.Z = m3.Z + abs(this->matrices.projectionMatrix.M[2][3]); => m3.Z = m3.Z + 1.0; |
Teď ten kód funguje jak pro LH, tak pro RH systém
Ještě ad clipping roviny.
Dříve v DX9 jsem je používal, jenomže v DX11 zmizela fixní pipeline a tím pádem i to. Dalo se to tam dělat přímo v shaderu, jenomže to zvyšovalo bordelnost toho shaderu a musel být speciální pro render s tím a bez toho. Tenkrát mi právě pet poradil tu Oblique projekci.
Díky za nápady, hlavně VODOvi. _________________ Perry.cz |
|
Návrat nahoru |
|
|
|