Directx Sprites - Wie verwendet man diese ?

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    Directx Sprites - Wie verwendet man diese ?

    Hallo,

    Ich habe eine Frage zu der verwendung von Directx for Managed Code.
    Und zwar wie sollte man die Sprite Objekte verwenden ?
    Zeichnet man zuerst ein Bild und lässt es dan durch ein Sprite darstellen ?
    Oder kann man durchaus auch mehrere Sprites darstellen ohne performance Verluste ?


    Hintergrund :
    Ich will ein Spiel programieren was auch animierte Grafiken beinhalten soll,
    dabei wollte ich auf Tilesets aufbauen die dann hinter abgespielt werden sollen.

    Wäre über eine kurze Antwort dankbar :)

    Mit freundlichen Grüßen
    BlackNetworkBit
    MFG 0x426c61636b4e6574776f726b426974
    InOffical VB-Paradise IRC-Server
    webchat.freenode.net/
    Channel : ##vbparadise
    Deine Frage gibt für mich irgendwie wenig Sinn.
    Ein Sprite kapselt den Mechanismus zum zeichnen, diese werden dann auf den Back bzw FrontBuffer gezeichnet, die eigt. Auch nur ein Bild im Memory sind.

    Idr zeichnen Sprites in dem sie Vertices erstellen mit texturkoordinaten und dann diese vertices über einen Draw call Zeichen. Wenn du dann viele Sprites hast, hast du viele Drawcalls und lieber wenige drawcalls mit vielen Informationen als umgekehrt.
    Da kommt dann das SpriteBatching ins Spiel, dass man sich mW auch für DX selbst machen darf.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Du sagst ​Sprite.Begin(spriteFlags);. Dann machst du möglichst viele DrawCalls mit z.B. ​Sprite.Draw2D(Game.DrawBuffer, System.Drawing.PointF.Empty, 0, System.Drawing.PointF.Empty, -1); und dann wieder ​Sprite.End();

    Das Problem ist nur, wenn du jetzt Transformationen oder Shader auf das Sprite anwendest, gelten diese für alle DrawCalls. Willst du das also nur für eine Textur haben, muss diese in einem eigenen Begin und End stehen. Du kann auch ein Sprite mehrfach verwenden, also mehrmals Begin und End aufrufen. Du brauchst dafür nicht immer ein neues erstellen, es sei denn du setzt Flags wie "D3.SpriteFlags.DoNotSaveState" welches dann die veränderten Devie Einstellungen nicht wieder zurück setzt. Wenn du aber eine Font mit einem Sprite zeichnest und hast vorher schon eine Textur gemalt, ist das die relative Position zur Textur also musst du hier wieder die Transformation zurücksetzen ​Sprite.Transform = Matrix.Identity;.
    MDX scheint tatsächlich einen Batching Algorithmus mit diesem Sprite implementiert zu haben.
    Jedoch ist MDX schon lange ausgestorben, selbst XNA, was man als Nachfolger sehen könnte gibt es nicht mehr.
    Sinnvoll wäre es eigt. etwas anderes zu verwenden. Wenn du weiterhin möglichst nah am echten DX bleiben willst(sogar noch näher), dann wäre etwas wie SharpDX/SlimDX sinnvoll, für Plattformunabhängigkeit, dann etwas wie OpenTK, was OpenGL wrapt.
    Oder auch MonoGame, was bedingt mit Plattformunabhängigkeit klar kommt(Shader sind sehr problematisch, ich habs nur geschafft mit Patches dafür zu sorgen, dass GLSL Shader angenommen werden, da die Übersetzung des simplesten HLSL Shaders bei mir bereits fehlschlug)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---