Laden...

2D Texturverschiebung: Objekte zusammen mit der Textur verschieben

Erstellt von Ayke vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.426 Views
Ayke Themenstarter:in
643 Beiträge seit 2006
vor 12 Jahren
2D Texturverschiebung: Objekte zusammen mit der Textur verschieben

Hallo,

ich mache grade ein kleines Spiel. Es spielt im Weltall.
Dazu habe ich ein 2D Hintergrund mit einer Textur aus Sternen. Die Textur wird verschoben wenn Sich mein Hauptobjekt (rot) bewegt. Das Hauptobjekt kann der Benutzer steuern. Es soll jedoch Nebenobjekte (blau) geben die Sich unabhängig vom Hauptobjekt bewegen (also mit der Textur). Die Texturkoordinaten gehen nur von z.B 0 - 1 oder 1 - 2 unsw... Wie bekomme ich die richtigen Nebenobjekt- Koordinaten relativ zur Textur. Ist das überhaupt der beste Weg mit der Texturverschiebung ?

                _background.SetTextureCoords(new Vector2(0.001f, 0));
                _planet.Move(new Vector2(-0.06f, 0));
        public void SetTextureCoords(Vector2 coordinates)
        {
            _movementCoord += coordinates;
            _background.TextureCoordinates =
                new Vector4(_movementCoord.X + 0.4f, _movementCoord.Y + 0.4f, _movementCoord.X + 0.8f, _movementCoord.Y + 0.8f);
        }


        public void Move(Vector2 amount)
        {
            _circle.PostionCoordinates = _circle.PostionCoordinates + amount;
        }
5.657 Beiträge seit 2006
vor 12 Jahren

Hi Ayke,

was ist das für eine Textur? Normalerweise verwendet man doch für solche Sachen eine CubeMap. Dadurch muß man also nicht die Textur bewegen, sondern nur die Kamera (bzw. eben dein Raumschiff). In dem Fall bewegt sich dann auch dein blaues Objekt relativ zur Kamera aber nicht relativ zum Hintergrund.

Christian

Weeks of programming can save you hours of planning

Ayke Themenstarter:in
643 Beiträge seit 2006
vor 12 Jahren

Hallo MrSparkle,

es ist eine 2D Texture. Ich mache ein 2D Spiel. Der Spielraum soll unendlich gross sein d.h. die Textur soll sich jedesmal wiederholen. Die Objekte (Planeten, Nebel etc.) im raum werden zufällig generiert und letztere wieder verworfen wie bei einer Queue (first in, last out). Ist da eine Cubemap immernoch richtige für mich ?

5.657 Beiträge seit 2006
vor 12 Jahren

Hi Ayke,

also wenn's ein 2D-Programm ist, verstehe ich ehrlich gesagt dein Problem nicht. Du verschiebst die Hintergrund-Textur nach links/rechts/oben/unten und verschiebst das blaue Objekt um den gleichen Wert in die gleiche Richtung. Was funktioniert dabei nicht?

Christian

Weeks of programming can save you hours of planning

Ayke Themenstarter:in
643 Beiträge seit 2006
vor 12 Jahren

Hallo MrSparkle,

da gibts kein Problem. Was ist aber wenn es ein paar tausend Objekte sind die ich verschieben muss sogar welche die ausserhalb der Projektion sind. Wäre es da nicht sinnvoller die Modelview Matrix zu verschieben ?

[EDIT]
Nein macht leider keinen Performance- Unterschied.

Ayke Themenstarter:in
643 Beiträge seit 2006
vor 12 Jahren

Habs jetzt ausprobiert und das verschieben von der Vertices zwingt mein PC in die Knie (ca 10000+ Vertices, Quadcore x ca. 2.0 Ghz).

[EDIT]
Hab grad einen Performance Profiler laufen lassen. Meine Zeichenroutine mit den Vertexbuffer hatte wohl einen kincken. Bereinigung hat leider keinen grossen Performance- Zuwachs gebracht.

5.657 Beiträge seit 2006
vor 12 Jahren

Hi Ayke,

ich sehe wirklich keinen Grund dafür, mehr als 10000 Vertices zu erstellen, um ein paar hundert Sterne darzustellen. Ich würde in deinem Fall eine Textur für den Hintergrund verwenden und Meshs für das rote und blaue Objekt. Da die Sterne und das blaue Objekt ihre Position relativ zueinander nicht ändern, werden sie mit der gleichen WordMatrix gerendert. Wenn das rote Objekt sich unabhängig dazubewegen soll, dann benötigt es zusätzlich eine eigene Matrix.

Christian

Weeks of programming can save you hours of planning

M
29 Beiträge seit 2011
vor 12 Jahren

Tipp: Jeder Stern ein Vertex.

Vertexshader: Normale auf Kamera ausrichten
Geometryshader: Orthogonal um die Normale ein Quad aufspannen aus 2 Dreiecken und mit Distanz im Viewspace multiplizieren (damit beim zoomen das quad relativ zum Bildschirm immer gleich bleibt). In einem neuen Array bei jedem Punkt des Quads die Koordinaten +1 bzw. -1 für die Position im Quad speichern.

Pixelshader: Mit diesen Koordinaten kannst du nun für jeden pixel den Abstand zum Mittelpunkt des Quads berechnen und damit mit ner Gauß-Glockenkurve zb. einen radialen Verlauf zeichnen.

Ergebnis:
siehe Anhang

Das sind 2 Screenshots(etwas gestaucht, aspect ratio war gerade nicht angepasst) von einem projekt bei dem ich dabei war für ne Powerwall. Ales DirectX10.

M
29 Beiträge seit 2011
vor 12 Jahren

Noch ein Screenshot:

Ayke Themenstarter:in
643 Beiträge seit 2006
vor 12 Jahren

Hallo MrSparkle,

hab mein Code jetzt angepasst. Vorher hatte ich eine rießige Collection mit Rectangles (mit einer Stern, Nebel Texture).
Jetzt habe ich es in Blöcke aufgeteilt. Jeder block hat seine eigene Collection. Wenn der Bildschrim über ein Block navigiert
wird nur seine Collection gerendert. Es sind jetzt ca 250 Sterne und 100x Nebel (2100 Vertices, hoffentlich leuft das auch auf den Handy).

Hallo MrHiggins,

um das zu verstehen bin ich noch zu leihenhaft in diesen Bereich. Bei mir hat eine Vertex nur ein Vector wie soll ich damit einen realtischen Stern erstellen ? Was ist eine Normale ? Hab zwar schon was gelesen, war aber ziemlich das Einsteiger Buch. Hab noch ein Buch angefangen, muss mich nur noch überwinden das durch zu pauken.

M
29 Beiträge seit 2011
vor 12 Jahren

Okay, laienhaft gesprochen:
Du zeichnest bisher Points für jeden Stern einen.

In dem Projekt wie du oben siehst, habe ich auch für jeden Stern nur einen Punkt. Aber auf der Grafikkarte spanne ich um diesen Punkt ein Quadrat auf. Und auf dieses Quadrat "male" ich dann (man könnte auch ne textur nehmen), einen Stern mit diesen Strahlen und Helligkeitsverlauf.

Dadurch werden die Sterne deutlich realistischer

Ayke Themenstarter:in
643 Beiträge seit 2006
vor 12 Jahren

ok das versteh ich 😃 Versuche ich mal dank dir.

M
29 Beiträge seit 2011
vor 12 Jahren

Kannst aber erstmal so lassen als Anfänger... das lief bei uns auf aktuellen Grafikkarten und ich hab dafür einige Zeit gebraucht:-)