DGL
https://delphigl.com/forum/

[geloest] Tangent Space und Vertex Shader
https://delphigl.com/forum/viewtopic.php?f=20&t=10043
Seite 1 von 1

Autor:  Ireyon [ So Aug 21, 2011 14:24 ]
Betreff des Beitrags:  [geloest] Tangent Space und Vertex Shader

Moin.

Ich stehe vor einem Problem. Und zwar habe ich Parallax Occlusion Mapping implementiert, das auch so weit super funktioniert:
Bild

Jetzt habe ich aber ein Problem. Und zwar bietet das Spiel unter anderem die Möglichkeit, Objekte zu spiegeln, zu skalieren und an der Y-Achse zu verzerren. Ich berechne die Tangenten wie hier beschrieben, mit der Bitangente im Vertex Shader. Das Problem ist, dass bereits bei Achsenspiegelungen mindestens eine der Tangenten in die falsche Richtung zeigt. Einfach alles mit dem Mirror-Vektor multiplizieren geht natürlich nicht, irgendwas zeigt da immer in die falsche Richtung. Bislang habe ich auch noch nicht so wirklich was gefunden, was das Problem lösen könnte, und ich möchte ungerne alles auf der CPU machen, zumal das auch wieder neue VBOs benötigen würde - hat jemand Ideen?

Mir käme da ein höchstens noch Geometry Shader in den Sinn, allerdings verlangsamen die die Vertextransformationen um gefühlte 50%. Aber geht es auch ohne?

Wäre dankbar für Hilfe. :)

Autor:  damadmax [ Mo Aug 22, 2011 10:56 ]
Betreff des Beitrags:  Re: Tangent Space und Vertex Shader

Hi Ireyon,

bin mal über dfdx/dfdy gestolpert. Ich habs nie richtig hinbekommen aber vielleicht hast du mehr Glück.

Im 10. Post ist ein Beispiel

Autor:  Ireyon [ Mo Aug 22, 2011 19:55 ]
Betreff des Beitrags:  Re: Tangent Space und Vertex Shader

Damit hatte ich auch schon rumgespielt, allerdings stimmen da die Orientierungen auch nicht zwangsläufig und es ist numerisch instabil :(

naja, berechne die Tangenten jetzt im Geometry Shader, läuft schnell genug.

Autor:  yunharla [ Do Sep 01, 2011 00:30 ]
Betreff des Beitrags:  Re: [geloest] Tangent Space und Vertex Shader

Bull****
Code:
  1.  
  2. poly->tangentSpaceTransform[ 0 ][ 2 ] = poly->normal[ 0 ];
  3. poly->tangentSpaceTransform[ 1 ][ 2 ] = poly->normal[ 1 ];
  4. poly->tangentSpaceTransform[ 2 ][ 2 ] = poly->normal[ 2 ];
  5.  
  6. s = ( poly->tc[ 1 ].x - poly->tc[ 0 ].x ) * ( tc.y - poly->tc[ 0 ].y );
  7. s -= ( tc.x - poly->tc[ 0 ].x ) * ( poly->tc[ 1 ].y - poly->tc[ 0 ].y );
  8. s = 1.0f / s;
  9.  
  10. temp1 = poly->verts[ 1 ] - poly->start;
  11. temp1 *= tc.y-poly->tc[0].y;
  12. temp2 = poly->verts[ 2 ] - poly->start;
  13. temp2 *= poly->tc[ 1 ].y  -poly->tc[0].y;
  14. temp3 = temp1-temp2;
  15. temp3 *= s;
  16. temp3 = normalize(temp3)
  17. poly->tangentSpaceTransform[ 0 ][ 0 ] = temp1[ 0 ];
  18. poly->tangentSpaceTransform[ 1 ][ 0 ] = temp1[ 1 ];
  19. poly->tangentSpaceTransform[ 2 ][ 0 ] = temp1[ 2 ];
  20.  
  21. temp1 = poly->verts[ 2 ] - poly->start;
  22. temp1 *= tc.x-poly->tc[0].x;
  23. temp2 = poly->verts[ 1 ] - poly->start;
  24. temp2 *= poly->tc[ 1 ].x  -poly->tc[0].x;
  25. temp3 = temp1-temp2;
  26. temp3 *= s;
  27. temp3 = normalize(temp3)
  28.  
  29. poly->tangentSpaceTransform[ 0 ][ 1 ] = temp1[ 0 ];
  30. poly->tangentSpaceTransform[ 1 ][ 1 ] = temp1[ 1 ];
  31. poly->tangentSpaceTransform[ 2 ][ 1 ] = temp1[ 2 ];
  32.  



viel spaß beim kürzen :)

hier mal für die dummies

Vertex2 = Vertex1 + (sDifference * sVector) + (tDifference * tVector)

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/