![]() |
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. |
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 |
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:
Ist also eigentlich recht simpel gehalten.
[...]
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) |
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. |
Re: Problem mit Triangle Strip
Danke für deine Antwort - ich werde das mal mit dem Fan ausprobieren und dann nochmal bescheid geben.
|
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.
|
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 12:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz