Ausgefülltes Polygon mit Löchern zeichnen
-
Hallo Freunde,
ich möchte gerne ausgefüllte(Himmeltextur, Ziegeltextur) Polygone zeichen können, welche so aussehen:
http://www.zhmak.info/uploads/posts/2008-03/1206048252_c02f74c79972.jpg
Das heißt, es gibt ein großes Polygon(Viereck), welches größer als der Bildschirm ist. In diesen befinden sich weitere Polygone. Sie können beliebig verschachtelt werden, wodurch dann Löcher entstehen. Polygonlinen können sich nicht schneiden.
Wie könnte ich sowas am schnellsten Zeichnen?
Meine Ideen:
1. Pixelweises zeichen. Z.b. Scanlinealgorithmus.
2. Erstellen (z.B. mit dem Scanlinealgorithmus) von zwei Texturen und dann Zeichen per Alphablending(so wie hier http://nehe.gamedev.net/tutorial/masking/15006/ ) -> Problem: Was ist, wenn das Äußerste Polygon größer als 512 mal 512 Pixel ist? Lösung:
3. Erstellen von vielen 512 x 512 Texturen => Problem: 300 MB(Kartengröße: 10000 x 10000 Pixel) Speicherbedarf im Texturpuffer. Ich will ein kleines Spaßspiel schreiben, was möglichst wenig Speicher + CPU braucht.Wie könnten die Entwickler von den Motoradspiel(Elma) vorgeganen sein? Welche Polygonzeichenalgorithmen wären da sinnvoll, um die Gesamte Karte zu zeichen?
-
Z.B. OpenGL verwenden.
Beim rendern zusätzlich in den Stancil Buffer rendern.
Z.B. zuerst das große Polygon mit 1 Einträgen. Dann die kleinen Polygone mit 0 Einträgen. Den Stancil Buffer mit dem richtigen Rendern verknüpfen und nur dort zeichnen wo im Stancil Buffer noch ne 1 steht.
-
Wie groß darf der Stencil-Puffer sein? Weil wenn meine Karte z.B. 10.000 x 10.000 Pixel groß ist, und ich sehe immer nur ein Bildausschnitt von 1000 x 1000, dann muss man entweder bei jeden Scroll den Stencil-Puffer neu berechnen. Außer er ist eben auch 10.000 x 10.000 Pixel groß.
-
Ich glaube ich hab mal was in der SDL lib gesehen, was surfaces erstellen kann und dann polygone auf diesen Surfaces zeichnet (2D) ,sodass du deine Texturen usw. gut ausnutzen kannst
-
XMAMan: Also Stencilbuffer in jedem Frame neu berechnen sollte imo ziemlich okay sein.
-
Ich probier das jetzt mit OpenGL einfach mal aus. Ich möchte den Stencil-Puffer erstellen, indem ich zuerst das größte Polygon zeichne(Setze Puffer-Bereich auf 1). Dann zeichne ich alle darin enthaltenen Polygone(Zweimal 1 ergibt wieder 0) und so weiter.
-
Weil wenn meine Karte z.B. 10.000 x 10.000 Pixel groß
Und du laedst die 100 MByte Textur als Ganzes und renderst sie als Ganzes?
-
@knivil: Hm, ja... das geht dann nicht. Man muss den Stencil-Puffer bei jeden Frame also neu berechnen. Anders gehts wohl leider nicht.
-
Was spricht dagegen, es gneau so zu machen, wie es das spiel tut: zuerst ein großes Rechteck zeichnen auf das eine Textur gekachelt wird. dann einfach die Löcher drüber zeichnen.
-
Warum sollte man 100% rendern wenn sowieso nur 1% sichtbar ist?
-
weil es nichts kostet.
-
Also ich würde so eine Map nicht als ein großes Polygon mit Löchern betrachten, sondern eher als einen Haufen Polygone. Schau dir mal SFML an...
-
Jo...
Himmel zeichnen, Ziegel drüber zeichnen, Gras drüber zeichnen, gewonnen.
Wenn du weniger Overdraw willst, kannst du ja die Himmel-Polygone (manuell, im Level Editor) so zurechtschneiden dass nur der sichtbare Teil gezeichnet wird. Da du aber immer noch von hinten nach vorne zeichnest, muss das nicht genau sein -- ungefähr Pi * Daumen ausgeschnitten reicht vollkommen - darf nur nicht zu wenig sein.
Kann man natürlich auch automatisieren. Je schlauer man das ganze macht, desto weniger CPU und GPU wird es weglutschen, aber dafür muss man dann auch entsprechend viel programmieren.
-
dot schrieb:
Also ich würde so eine Map nicht als ein großes Polygon mit Löchern betrachten, sondern eher als einen Haufen Polygone. Schau dir mal SFML an...
Waaaaaaaaaaah, er hat SFML gesagt!!!
Wo ist die SDL <-> SFML Polizei wenn man sie braucht???
-
He Leute, ich habe ein Big-Problem
Problem 1: Es ist Samstag Abend und ich sitze hier und programmiere.
Problem 2: OpenGL zeichnet meine Polygone nicht so wie ich will.
Schaut mal auf das Bild. Links habe ich mit System.Drawing(GDI+) ausgegeben, rechts mit OpenGL. Ich habe eine Krake mit Polygonen gezeichnet. Links ist es so wie es sein sein soll, rechts mit OpenGL, was Probleme macht.
http://img840.imageshack.us/img840/9770/polygonfehler.png
Hier der OpenGL-Code:
public override void drawFillPolygon(string texture, List<Vertex> points, bool makeFirstPixelTransparent) { Gl.glEnable(Gl.GL_TEXTURE_2D); Gl.glColor3f(1,1,1); Gl.glBindTexture(Gl.GL_TEXTURE_2D, getTexture(texture, makeFirstPixelTransparent, null).texturID); Gl.glBegin(Gl.GL_POLYGON); foreach (Vertex V in points) { Gl.glTexCoord2f(V.s, V.t); Gl.glVertex2i(V.x, V.y); } Gl.glTexCoord2f(points[0].s, points[0].t); Gl.glVertex2i(points[0].x, points[0].y); Gl.glEnd(); }
Hier der GDI+-Code
public override void drawFillPolygon(string texture, List<Vertex> points, bool makeFirstPixelTransparent) { Point[] newPoints = new Point[points.Count]; for (int i=0;i<newPoints.Length;i++) newPoints[i] = new Point(points[i].x, points[i].y); if (graph != null) graph.FillPolygon(getTexture(texture, makeFirstPixelTransparent, null).textureBrush, newPoints); } ... public class Vertex { public float s; public float t; public int x; public int y; public Vertex(); }
Warum will die Krake nicht so wie ich will?
-
OpenGL kann nur konvex, nicht aber konkav? Brauche ich etwa das hier? http://wiki.delphigl.com/index.php/Ear_Clipping_Triangulierung
Ihr müsst mir helfen
-
Ah ja... ich habe jetzt mal alle konkaven Polygone in Dreiecke zerlegt.
So sieht es nun aus:
http://img163.imageshack.us/img163/9770/polygonfehler.png
Es geht vorran mit mein bescheuerten Spiel