.[ ČeskéHry.cz ].
Voda - bug

 
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
perry



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

PříspěvekZaslal: 1. únor 2014, 20:24:15    Předmět: Voda - bug Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 1. únor 2014, 20:45:25    Předmět: Odpovědět s citátem

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



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 1. únor 2014, 21:32:52    Předmět: Odpovědět s citátem

Poněkud komické, že na otázku ohledně vody odpovídá VODA. Very Happy
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



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

PříspěvekZaslal: 1. únor 2014, 22:27:53    Předmět: Odpovědět s citátem

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 Confused
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 1. únor 2014, 22:34:41    Předmět: Odpovědět s citátem

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



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

PříspěvekZaslal: 2. únor 2014, 00:09:37    Předmět: Odpovědět s citátem

Ř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
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
perry



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

PříspěvekZaslal: 2. únor 2014, 08:56:45    Předmět: Odpovědět s citátem

Tak první chyba byla přesně jak jsem říkal. Clip plane a skutečná výška hladiny byly nastaveny jinak cca. o 0.1 Evil or Very Mad Terén je teď bez artefaktů, ale kostka je pořád divně Mad, jako by se právě vůbec neclipnula. Přitom matice používá stejné jako terén
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 2. únor 2014, 15:05:36    Předmět: Odpovědět s citátem

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



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

PříspěvekZaslal: 2. únor 2014, 15:42:22    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 2. únor 2014, 15:58:31    Předmět: Odpovědět s citátem

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



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

PříspěvekZaslal: 2. únor 2014, 16:03:34    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 2. únor 2014, 16:11:53    Předmět: Odpovědět s citátem

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



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

PříspěvekZaslal: 2. únor 2014, 16:33:44    Předmět: Odpovědět s citátem

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
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 -> 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