Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
2D Texturverschiebung: Objekte zusammen mit der Textur verschieben
Ayke
myCSharp.de - Member

Avatar #avatar-2293.gif


Dabei seit:
Beiträge: 655
Herkunft: Hamburg

Themenstarter:

2D Texturverschiebung: Objekte zusammen mit der Textur verschieben

beantworten | zitieren | melden

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;
        }
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Ayke am .
Attachments
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5963
Herkunft: Leipzig

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Ayke
myCSharp.de - Member

Avatar #avatar-2293.gif


Dabei seit:
Beiträge: 655
Herkunft: Hamburg

Themenstarter:

beantworten | zitieren | melden

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 ?
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5963
Herkunft: Leipzig

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Ayke
myCSharp.de - Member

Avatar #avatar-2293.gif


Dabei seit:
Beiträge: 655
Herkunft: Hamburg

Themenstarter:

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Ayke am .
private Nachricht | Beiträge des Benutzers
Ayke
myCSharp.de - Member

Avatar #avatar-2293.gif


Dabei seit:
Beiträge: 655
Herkunft: Hamburg

Themenstarter:

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Ayke am .
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5963
Herkunft: Leipzig

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
MrHiggins
myCSharp.de - Member



Dabei seit:
Beiträge: 29

beantworten | zitieren | melden

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.
Attachments
private Nachricht | Beiträge des Benutzers
MrHiggins
myCSharp.de - Member



Dabei seit:
Beiträge: 29

beantworten | zitieren | melden

Noch ein Screenshot:
Attachments
private Nachricht | Beiträge des Benutzers
Ayke
myCSharp.de - Member

Avatar #avatar-2293.gif


Dabei seit:
Beiträge: 655
Herkunft: Hamburg

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
MrHiggins
myCSharp.de - Member



Dabei seit:
Beiträge: 29

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Ayke
myCSharp.de - Member

Avatar #avatar-2293.gif


Dabei seit:
Beiträge: 655
Herkunft: Hamburg

Themenstarter:

beantworten | zitieren | melden

ok das versteh ich :) Versuche ich mal dank dir.
private Nachricht | Beiträge des Benutzers
MrHiggins
myCSharp.de - Member



Dabei seit:
Beiträge: 29

beantworten | zitieren | melden

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