.[ ČeskéHry.cz ].
chybné tangenty

 
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
micky



Založen: 28. 02. 2008
Příspěvky: 348
Bydliště: Plzeň, Praha

PříspěvekZaslal: 1. červen 2010, 16:31:37    Předmět: chybné tangenty Odpovědět s citátem

Zdravím vás, narazil jsem na takový problém ohledně generování tangent. Ty využívám pro dot3 bump mapping. Zde jsou takové dva "ukázkové" screeny, jeden s originálním shaderem, druhý posouvá trojúhelníky ve směru tangenty.

Tímto kódem generuji tangentu, nezdá se mi být špatně...
kód:

 void ComputeTangentBasis(
      const vec& P1, const vec& P2, const vec& P3,
      const vec2& UV1, const vec2& UV2, const vec2& UV3,
      vec &tangent )
{
   vec Edge1 = P2 - P1;
   vec Edge2 = P3 - P1;
   vec2d Edge1uv;
   Edge1uv.x = UV2.x - UV1.x;
   Edge1uv.y = UV2.y - UV1.y;
   vec2d Edge2uv;
   Edge2uv.x = UV3.x - UV1.x;
   Edge2uv.y = UV3.y - UV1.y;
   
   float cp = Edge1uv.y * Edge2uv.x - Edge1uv.x * Edge2uv.y;

   if ( cp != 0.0f ) {
      float mul = 1.0f / cp;
      tangent   = (Edge1 * -Edge2uv.y + Edge2 * Edge1uv.y) * mul;
      tangent.Normalize();//pro jistotu...
   }
}


Chtěl bych vědět, setkal jste se s tím už někdo? Je to chyba exportu od grafika (ale na všech modelech???) nebo moje? Díky za vaše názory a rady. Smile
_________________
https://www.bluepulsar.cz/
https://twitter.com/11thDream_Game/
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. červen 2010, 18:35:33    Předmět: Odpovědět s citátem

Já počítám tangenty víceméně stejně...
Akorát mám navíc normalizaci Edge1, Edge2, Edge1uv a Edge2uv před tím, než počítám cp.
A to co máš označený jako tangent, tak to je u mě binormala Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
micky



Založen: 28. 02. 2008
Příspěvky: 348
Bydliště: Plzeň, Praha

PříspěvekZaslal: 1. červen 2010, 19:36:31    Předmět: Odpovědět s citátem

To by ale nemělo mít nějaký zásadní vliv... Smile Zkusím tu normalizaci, ale moc nevěřím, že to pomůže...

EDIT: Nepomohlo. Very Happy
_________________
https://www.bluepulsar.cz/
https://twitter.com/11thDream_Game/
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
micky



Založen: 28. 02. 2008
Příspěvky: 348
Bydliště: Plzeň, Praha

PříspěvekZaslal: 2. červen 2010, 14:20:00    Předmět: Odpovědět s citátem

Tak jsem se jenom ujistil, skutečně přibližně polovina tangent není kolmá na normály. To mi přijde víceméně jako zásadní chyba... Very Happy Chyba bude asi v texturových koordinátách, ale kde... přece normal mapa používá stejné jako diffuse mapa. Funkce na tangenty vypadá v pořádku přece.
_________________
https://www.bluepulsar.cz/
https://twitter.com/11thDream_Game/
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Játro.m



Založen: 01. 02. 2010
Příspěvky: 230

PříspěvekZaslal: 2. červen 2010, 14:45:17    Předmět: Odpovědět s citátem

No, jelikoz ten kod kterej pouzivam mam obslehlej z internetu tak tady mas funkcni sampl. http://nopaste.ceske-hry.cz/223057 Pouzivam to na bumpmapping s paralaxem a specularmapama a funguje to spolehlive. Mozna tam mas nejakou prasecinu se znaminkama. Jo, pokud se nekomu neco na tom kodu nelibi...Very Happy
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
micky



Založen: 28. 02. 2008
Příspěvky: 348
Bydliště: Plzeň, Praha

PříspěvekZaslal: 2. červen 2010, 19:14:05    Předmět: Odpovědět s citátem

Máme ten kód úplně stejnej. Prošel jsem si to už dvakrát... Sad

EDIT: Funkce je tedy správně, sunu tam nějak špatný hodnoty.
_________________
https://www.bluepulsar.cz/
https://twitter.com/11thDream_Game/


Naposledy upravil micky dne 2. červen 2010, 20:44:26, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
if.then



Založen: 13. 04. 2008
Příspěvky: 579

PříspěvekZaslal: 2. červen 2010, 20:07:29    Předmět: Odpovědět s citátem

Takže chyba v modelu... Confused Nech grafika zkontrolovat model a jestli bude správně, pak je chyba v exporteru

(anebo v části kódu, kterou jsi nezveřejnil)
_________________
For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Játro.m



Založen: 01. 02. 2010
Příspěvky: 230

PříspěvekZaslal: 2. červen 2010, 20:28:02    Předmět: Odpovědět s citátem

hele a nemas ty jenom otoceny texturovaci koordinaty? jako ze je mas treba v minusu kvuli otocenejm texturam like BMP? a nebo spis ukaz jak to potom dostavas do ogl, indexujes to? Myslim pomoci indice vertexu.
EDIT: a co vubec pouzivas k tomu bump mappingu? Pouzivas aspon shadery? Nebo jeste pouzivas nejakou tu DOT3 extenzi co je v FFP?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
micky



Založen: 28. 02. 2008
Příspěvky: 348
Bydliště: Plzeň, Praha

PříspěvekZaslal: 2. červen 2010, 20:47:27    Předmět: Odpovědět s citátem

No, používám HLSL shadery, directX. Teď jsem se na samotnej efekt vyflákl, zobrazuju pořád jen ty tangenty (barvičky, r=x, g=y, b=z). Texturu nemám otočenou, už jsem to kontroloval. Normály se generujou správně, takže vadný pořadí vrcholů v trojúhelníku to taky není. Někde jsem se uklepl. A koukám, že dost draze.
_________________
https://www.bluepulsar.cz/
https://twitter.com/11thDream_Game/
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Játro.m



Založen: 01. 02. 2010
Příspěvky: 230

PříspěvekZaslal: 2. červen 2010, 21:00:09    Předmět: Odpovědět s citátem

tak sem zkus hodit jak to dostavas z te funkce do pole tangent Wink treba tam mas jenom nejakou pitomou chybu ktera to takle blbne
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
micky



Založen: 28. 02. 2008
Příspěvky: 348
Bydliště: Plzeň, Praha

PříspěvekZaslal: 2. červen 2010, 21:18:37    Předmět: Odpovědět s citátem

kód:

a.x = vtex1[tris[j*3]*2];  a.y = vtex1[tris[j*3]*2+1];
b.x = vtex1[tris[j*3+1]*2];b.y = vtex1[tris[j*3+1]*2+1];
c.x = vtex1[tris[j*3+2]*2];c.y = vtex1[tris[j*3+2]*2+1];

ComputeTangentBasis( vec(vpos[tris[j*3+0]*3+0],vpos[tris[j*3+0]*3+1],vpos[tris[j*3+0]*3+2]),
                  vec(vpos[tris[j*3+1]*3+0],vpos[tris[j*3+1]*3+1],vpos[tris[j*3+1]*3+2]),
                vec(vpos[tris[j*3+2]*3+0],vpos[tris[j*3+2]*3+2],vpos[tris[j*3+2]*3+2]),
                a,b,c,
                  faceT[j] );


prvni tri parametry - pozice vrcholu (tris = odkazy na vrcholy vpos)
a,b,c - texturove koordinaty
faceT - vracena tangenta

nevidim tam chybu, fakt ne... :/
_________________
https://www.bluepulsar.cz/
https://twitter.com/11thDream_Game/
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Játro.m



Založen: 01. 02. 2010
Příspěvky: 230

PříspěvekZaslal: 2. červen 2010, 21:32:23    Předmět: Odpovědět s citátem

no ja ji asi vidim Wink podivej se do myho kodu ze tam mam 3x kod u tangenty, mozna te napadne co tim delam Very Happy ty to prirazujes do pole ale podle jenom jednoho indexu ty ostatni co jsou podle vertexu ti chybi.

kód:


vTangent[face[i].a].x = tangent.x;
vTangent[face[i].a].y = tangent.y;
vTangent[face[i].a].z = tangent.z;

vTangent[face[i].b].x = tangent.x;
vTangent[face[i].b].y = tangent.y;
vTangent[face[i].b].z = tangent.z;

vTangent[face[i].c].x = tangent.x;
vTangent[face[i].c].y = tangent.y;
vTangent[face[i].c].z = tangent.z;


udelej to stejne jak mas ty vertexy co davas do te funkce Wink
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
micky



Založen: 28. 02. 2008
Příspěvky: 348
Bydliště: Plzeň, Praha

PříspěvekZaslal: 2. červen 2010, 21:34:42    Předmět: Odpovědět s citátem

Z toho pole faceT si to potom načte vertex buffer...

kód:

buf[ii].t = ((*it)->faceT)?(*it)->faceT[ii/3]:vec(1,0,0);


Takže tam ta chyba není, i když bych jí tam moc rád viděl Sad
_________________
https://www.bluepulsar.cz/
https://twitter.com/11thDream_Game/
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Játro.m



Založen: 01. 02. 2010
Příspěvky: 230

PříspěvekZaslal: 2. červen 2010, 21:40:33    Předmět: Odpovědět s citátem

Jáj, tak to už fakt nevím, už se v tom tvym kodu začinám ztrácet.. :/
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
micky



Založen: 28. 02. 2008
Příspěvky: 348
Bydliště: Plzeň, Praha

PříspěvekZaslal: 2. červen 2010, 21:52:10    Předmět: Odpovědět s citátem

kód:

ComputeTangentBasis( vec(vpos[tris[j*3+0]*3+0],vpos[tris[j*3+0]*3+1],vpos[tris[j*3+0]*3+2]),
                  vec(vpos[tris[j*3+1]*3+0],vpos[tris[j*3+1]*3+1],vpos[tris[j*3+1]*3+2]),
                vec(vpos[tris[j*3+2]*3+0],vpos[tris[j*3+2]*3+2],vpos[tris[j*3+2]*3+2]),
                a,b,c,
                  faceT[j] );


HEURÉKA! Tak já myslel, že je to totální chyba v postupu nebo tak... všimněte si třetího parametru, u Y zadávám +2, ne +1. Poučil jsem se. Díky všem za rady, že to bude až taková konina, to jsem netušil... Embarassed Very Happy
_________________
https://www.bluepulsar.cz/
https://twitter.com/11thDream_Game/
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