Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Problem mit Triangle Strip (https://www.delphipraxis.net/102421-problem-mit-triangle-strip.html)

igel457 28. Okt 2007 17:42


Problem mit Triangle Strip
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

in meiner 2D-Engine möchte ich die Möglichkeit geben ein beliebiges Viereck zu zeichnen und eine Textur dort hinein zu verfrachten. Nun habe ich damit versuch einen Text gekippt (so wie bei Krieg der Sterne) auszugeben - doch leider ist das, was dabei herauskommt ein wenig "seltsam". Der Text im zweiten Polygon ist anders gestaucht als im ersten.
Das bedeutet: Ich verstehe schon, warum es so aussieht, allerdings wüsste ich gerne ob ich dieses Problem (außer als Rotation um die X-Achse) lösen kann.
Im Anhang ist ein Screenshot, der mein Problem vielleicht ein wenig verdeutlicht.

BUG 28. Okt 2007 18:06

Re: Problem mit Triangle Strip
 
Hallo igel457,

vielleicht tritt der Effekt nicht mehr, wenn du das Viereck in möglichst viele Dreiecke aufteilst.

Mfg,
Bug

igel457 28. Okt 2007 18:12

Re: Problem mit Triangle Strip
 
Danke für die Antwort,
da könntest du recht haben - allerdings möchte ich diesen Weg eigentlich erstmal vermeiden.

Hier ist mal noch ein wenig Code angehängt:
Delphi-Quellcode:
[...]
    SetLength(vertices, 4);

    vertices[0].Position := AdVector3(FQuad.p[0].x,FQuad.p[0].y, 0);
    vertices[0].Color := FQuad.c[0];
    vertices[1].Position := AdVector3(FQuad.p[1].x,FQuad.p[1].y, 0);
    vertices[1].Color := FQuad.c[1];
    vertices[2].Position := AdVector3(FQuad.p[3].x,FQuad.p[3].y, 0);
    vertices[2].Color := FQuad.c[3];
    vertices[3].Position := AdVector3(FQuad.p[2].x,FQuad.p[2].y, 0);
    vertices[3].Color := FQuad.c[2];

    if FBrush.Texture <> nil then
    begin
      [...]
      if Brush.TextureMode = tmStretchAlign then
      begin
        vertices[0].Texture := AdVector2(0,0);
        vertices[1].Texture := AdVector2(1,0);
        vertices[2].Texture := AdVector2(0,1);
        vertices[3].Texture := AdVector2(1,1);
      end;    
    end;

    FMesh.PrimitiveCount := 2;
    FMesh.Vertices := vertices;
    FMesh.IndexBuffer := nil;
    FMesh.Update;
    FMesh.SetMatrix(AdMatrix_Identity);
    FMesh.Texture := FBrush.Texture;
[...]
    FMesh.Draw(bmAlpha, dmTriangleStrip)
Ist also eigentlich recht simpel gehalten.

Lossy eX 28. Okt 2007 22:14

Re: Problem mit Triangle Strip
 
Liste der Anhänge anzeigen (Anzahl: 2)
Vierecke werden daran nichts ändern, denn die werden intern auch nur in Dreiecke zerlegt. Das Problem liegt daran, dass diese Darstellung ohne Perspektive statt findet. Und ich weiß nicht genau wie ich das erklären soll. Aber OpenGL weiß nicht wie es die Texturkoordinaten interpolieren soll. Habe mal dein Bild angehangen und eingezeichnet wie in etwas die horizontale Mitte verlaufen müsste.

Abhelfen könntest du das indem du mit Shadern die Texturkoordinaten so berechnest dass sie passen. Oder aber in dem du die Fläche unterteilst. Und zwar würdest du so die Texturkoordinaten mehr oder weniger in eine bestimmte Bahn zwingen. Das Problem würde zwar weiterhin bestehen aber es würde nicht mehr ganz so stark auffallen.

Das zweite Bild ist ein Triangle Fan. Also lediglich 2 Flächen mehr. Allerdings liegt der Punkt genau in der Mitte was den positiven Effekt begünstigt.

igel457 29. Okt 2007 14:58

Re: Problem mit Triangle Strip
 
Danke für deine Antwort - ich werde das mal mit dem Fan ausprobieren und dann nochmal bescheid geben.

igel457 29. Okt 2007 15:50

Re: Problem mit Triangle Strip
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also die Lösung mit dem Triangle Fan funktioniert soweit, die Verzerrung fällt nicht mehr ganz so arg auf. Ich habe noch einen Screenshot angehängt.

Lossy eX 29. Okt 2007 20:02

Re: Problem mit Triangle Strip
 
Noch als Anmerkung. Du kannst anstelle des Fans natürlich auch jedes andere Primitiv benutzen. Denn die Unterteilung der Fläche ist der Grund warum es nicht mehr stark auffällt. Und da intern sowieso alles Dreiecke sind spielt es also überhaupt keine Rolle in welcher Form die Dreiecke gezeichnet werden. Sondern eben nur, dass sie gezeichnet werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz