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
|
Zaslal: 1. červen 2010, 16:31:37 Předmět: chybné tangenty |
|
|
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.  _________________ https://www.bluepulsar.cz/
https://twitter.com/11thDream_Game/ |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 1. červen 2010, 18:35:33 Předmět: |
|
|
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  |
|
Návrat nahoru |
|
 |
micky

Založen: 28. 02. 2008 Příspěvky: 348 Bydliště: Plzeň, Praha
|
|
Návrat nahoru |
|
 |
micky

Založen: 28. 02. 2008 Příspěvky: 348 Bydliště: Plzeň, Praha
|
Zaslal: 2. červen 2010, 14:20:00 Předmět: |
|
|
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... 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 |
|
 |
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 2. červen 2010, 14:45:17 Předmět: |
|
|
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... |
|
Návrat nahoru |
|
 |
micky

Založen: 28. 02. 2008 Příspěvky: 348 Bydliště: Plzeň, Praha
|
Zaslal: 2. červen 2010, 19:14:05 Předmět: |
|
|
Máme ten kód úplně stejnej. Prošel jsem si to už dvakrát...
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 |
|
 |
if.then
Založen: 13. 04. 2008 Příspěvky: 579
|
Zaslal: 2. červen 2010, 20:07:29 Předmět: |
|
|
Takže chyba v modelu... 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 |
|
 |
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 2. červen 2010, 20:28:02 Předmět: |
|
|
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 |
|
 |
micky

Založen: 28. 02. 2008 Příspěvky: 348 Bydliště: Plzeň, Praha
|
Zaslal: 2. červen 2010, 20:47:27 Předmět: |
|
|
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 |
|
 |
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 2. červen 2010, 21:00:09 Předmět: |
|
|
tak sem zkus hodit jak to dostavas z te funkce do pole tangent treba tam mas jenom nejakou pitomou chybu ktera to takle blbne |
|
Návrat nahoru |
|
 |
micky

Založen: 28. 02. 2008 Příspěvky: 348 Bydliště: Plzeň, Praha
|
Zaslal: 2. červen 2010, 21:18:37 Předmět: |
|
|
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 |
|
 |
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 2. červen 2010, 21:32:23 Předmět: |
|
|
no ja ji asi vidim podivej se do myho kodu ze tam mam 3x kod u tangenty, mozna te napadne co tim delam 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  |
|
Návrat nahoru |
|
 |
micky

Založen: 28. 02. 2008 Příspěvky: 348 Bydliště: Plzeň, Praha
|
|
Návrat nahoru |
|
 |
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 2. červen 2010, 21:40:33 Předmět: |
|
|
Jáj, tak to už fakt nevím, už se v tom tvym kodu začinám ztrácet.. :/ |
|
Návrat nahoru |
|
 |
micky

Založen: 28. 02. 2008 Příspěvky: 348 Bydliště: Plzeň, Praha
|
Zaslal: 2. červen 2010, 21:52:10 Předmět: |
|
|
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...  _________________ https://www.bluepulsar.cz/
https://twitter.com/11thDream_Game/ |
|
Návrat nahoru |
|
 |
|