Laden und Zeichnen von Sprites

Bradley
Beiträge: 235
Registriert: 03.02.2013 19:05

Laden und Zeichnen von Sprites

Beitragvon Bradley » 04.04.2015 22:59

Ich steh noch sehr am Anfang und hab über ein Tutorial geladen.

Damit ist folgender Code zusammen gekommen:

Code: Alles auswählen

using System;
using System.Drawing;
using System.Windows.Forms;
using SharpDX;
using SharpDX.Direct3D;
using SharpDX.Direct3D11;
using SharpDX.DXGI;
using SharpDX.Windows;
using D3D11 = SharpDX.Direct3D11;

namespace SharpDXTutorials.Tutorial02
{
    class Program
    {
        private const int Width = 1280;
        private const int Height = 800;

        private static RenderForm _renderForm;

        // General Direct3D 11 stuff
        private static SwapChain _swapChain;
        private static D3D11.Device _d3d11Device;
        private static DeviceContext _d3d11DevCon;
        private static RenderTargetView _renderTargetView;

        // Rainbow background colors
        private static Color4 _backgroundColor;
        private static int _colorModR = 1;
        private static int _colorModG = 1;
        private static int _colorModB = 1;

        static void Main(string[] args)
        {
            // Create the game window in which we will draw our graphics
            _renderForm = new RenderForm("My first Game!");
            _renderForm.ClientSize = new Size(Width, Height);
            _renderForm.StartPosition = FormStartPosition.CenterScreen;

            // Initialize whatever we require before running the game loop
            InitializeD3D11();
            InitializeScene();

            // Let the renderloop use this form and call the specified method every time
            RenderLoop.Run(_renderForm, RenderCallback);

            DisposeObjects();
        }

        private static void InitializeD3D11()
        {
            // Describe our buffer
            ModeDescription bufferDescription = new ModeDescription()
            {
                Width = Width,
                Height = Height,
                RefreshRate = new Rational(60, 1),
                Format = Format.R8G8B8A8_UNorm
            };

            // Describe our swap chain
            SwapChainDescription swapChainDescription = new SwapChainDescription()
            {
                ModeDescription = bufferDescription,
                SampleDescription = new SampleDescription(1, 0),
                Usage = Usage.RenderTargetOutput,
                BufferCount = 1,
                OutputHandle = _renderForm.Handle,
                IsWindowed = true
            };

            // Create our device with swap chain and get the device context
            D3D11.Device.CreateWithSwapChain(DriverType.Hardware, DeviceCreationFlags.None,
                swapChainDescription, out _d3d11Device, out _swapChain);
            _d3d11DevCon = _d3d11Device.ImmediateContext;

            // Create our render target view and set it
            using (Texture2D backBuffer = _swapChain.GetBackBuffer<Texture2D>(0))
            {
                _renderTargetView = new RenderTargetView(_d3d11Device, backBuffer);
            }
            _d3d11DevCon.OutputMerger.SetRenderTargets(_renderTargetView);
        }

        private static void InitializeScene()
        {
            // We load models and other stuff here later before we start the game loop
        }

        /// <summary>
        /// // Here, our game update and drawing code will be placed.
        /// </summary>
        private static void RenderCallback()
        {
            UpdateScene();
            DrawScene();
        }

        /// <summary>
        /// Update the positioning of models, react on game input and do some other calculations
        /// which have to be done to make them ready to be drawn in RenderScene().
        /// </summary>
        private static void UpdateScene()
        {
            // Update the rainbow colored background
            _backgroundColor.Red += _colorModR * 0.005f;
            _backgroundColor.Green += _colorModG * 0.002f;
            _backgroundColor.Blue += _colorModB * 0.001f;
            if (_backgroundColor.Red >= 1f || _backgroundColor.Red <= 0f) _colorModR *= -1;
            if (_backgroundColor.Green >= 1f || _backgroundColor.Green <= 0f) _colorModG *= -1;
            if (_backgroundColor.Blue >= 1f || _backgroundColor.Blue <= 0f) _colorModB *= -1;
        }

        /// <summary>
        /// Draw all the models and other things as set up in UpdateScene().
        /// </summary>
        private static void DrawScene()
        {
            // Clear our backbuffer with the rainbow color
            _d3d11DevCon.ClearRenderTargetView(_renderTargetView, _backgroundColor);

            // Present our drawn scene waiting for one vertical sync
            _swapChain.Present(1, PresentFlags.None);
        }

        /// <summary>
        /// Cleanly stop and dispose the objects we used.
        /// </summary>
        private static void DisposeObjects()
        {
            // General Direct3D 11 stuff
            _swapChain.Dispose();
            _d3d11Device.Dispose();
            _d3d11DevCon.Dispose();
            _renderTargetView.Dispose();
        }

     
    }
}


Ich verstehe noch nicht wie ich ein Sprite laden kann.

Benutzeravatar
RolandK
Beiträge: 84
Registriert: 04.06.2013 20:42
Wohnort: Weiden i.d.OPf
Kontaktdaten:

Re: Laden und Zeichnen von Sprites

Beitragvon RolandK » 06.04.2015 08:47

Hi Bradley,

Verwendung von SpriteBatches o. Ä. ist im reinen SharpDX etwas schwieriger, als es z. B. in XNA war. Grund ist der, dass SharpDX grundsätzlich erst einmal nur die reine DirectX API verfügbar macht, SpriteBatch ist bei XNA aber ein Hilfsmittel, welches oben drauf entwickelt wurde. Wenn du möglichst schnell ein Ergebnis möchtest, solltest du dir eher SharpDX.Toolkit ansehen (wird aber nicht mehr aktiv weiterentwickelt). Diese Sachen waren einmal als eine Art modernes XNA gedacht.

Ich selbst verwende in meinen Projekten (=> https://github.com/RolandKoenig/FrozenSky) Direct2D, da diese API speziell zum Zeichnen von allen möglichen 2D Sachen gemacht ist und auch leicht zu verwenden ist. Sie baut auf Direct3D 10 / 11 auf und kann somit auch in das 3D-Rendering integriert werden.
Bei Direct2D muss man aber auch etwas aufpassen: Unter Windows 7 setzt Direct2D noch auf Direct3D 10 auf. Verwendet man also (wie ich) Direct3D 11, muss man sich in Win7 mit Device-Sharing Mechanismen rumschlagen. Unter Windows 8 / 8.1 hast du aber kein Problem.

Viele Grüße
Roland
http://www.rolandk.de/wp/
Meine Homepage mit Entwickler-Blog und mehreren Tutorials / Artikeln zu 3D-Rendering und anderen .Net Technologien.

Bradley
Beiträge: 235
Registriert: 03.02.2013 19:05

Re: Laden und Zeichnen von Sprites

Beitragvon Bradley » 06.04.2015 23:13

Großartig. Wieder etwas was quasi eingestellt ist.
Ich glaub ich arbeite mich einfach so in DirectX ein ...

Benutzeravatar
RolandK
Beiträge: 84
Registriert: 04.06.2013 20:42
Wohnort: Weiden i.d.OPf
Kontaktdaten:

Re: Laden und Zeichnen von Sprites

Beitragvon RolandK » 07.04.2015 05:08

Großartig. Wieder etwas was quasi eingestellt ist.

Damit muss man bei OpenSource Projekten oder der Ein oder Anderen Microsoft Library durchaus rechnen. Mit SharpDX selbst bist du aber gut bedient, hier geht's erst einmal weiter. Siehe: http://sharpdx.org/news/sharpdx-new-release-direct3d12

Ich persönlich entwickle daher möglichst nah an der DirectX-API. Denn: Wenn einer der Wrapper abgekündigt wird, findet sich auf kurz oder lang wieder ein neuer, welcher den Job auch gut macht. Vor 8 Jahren habe ich z. B. noch mit Microsoft.DirectX gearbeitet, danach mit SlimDX und jetzt mit SharpDX.
http://www.rolandk.de/wp/
Meine Homepage mit Entwickler-Blog und mehreren Tutorials / Artikeln zu 3D-Rendering und anderen .Net Technologien.

Bradley
Beiträge: 235
Registriert: 03.02.2013 19:05

Re: Laden und Zeichnen von Sprites

Beitragvon Bradley » 07.04.2015 10:03

Gut. Letztendlich bin ich aber mit meiner frage kein Stück weiter.
Wie lade ich ein Sprite und wie zeichne ich es.

Benutzeravatar
RolandK
Beiträge: 84
Registriert: 04.06.2013 20:42
Wohnort: Weiden i.d.OPf
Kontaktdaten:

Re: Laden und Zeichnen von Sprites

Beitragvon RolandK » 07.04.2015 19:27

Hi Bradley,

ich würde dir jetzt den Weg über Direct2D vorschlagen:
[*]Hier ein älteres Tutorial von mir: http://www.rolandk.de/index.php?option= ... ut=default
[*]Hier das Coding, mit dem ich das in meinen Direct3D Render-Prozess eingebaut habe. Auf diese Art zeichnet man quasi alle 2D-Grafiken direkt über den aktuellen Stand der RenderTarget-Textur von Direct3D: https://github.com/RolandKoenig/FrozenS ... enderer.cs

Für die Basics - falls noch nötig - würde ich direkt die Samples von SharpDX oder andere Einstiegstutorials empfehlen. Dein Quellcode von oben hat auf mich aber auf den ersten Blick schon gut gewirkt.

BTW: In SharpDX.Toolkit.Graphics gibt es einen SpriteBatch, der ziemlich ähnlich dem aus XNA funktionieren soll (kann ich selber aber nicht wirklich beurteilen, da beide noch nicht produktiv verwendet). Hat bei mir bei ersten Tests ganz gut gewirkt, ein Beispiel findest du bei den Samples von SharpDX. Aber.. das Problem kennste ja.

Viele Grüße
Roland
http://www.rolandk.de/wp/
Meine Homepage mit Entwickler-Blog und mehreren Tutorials / Artikeln zu 3D-Rendering und anderen .Net Technologien.

Benutzeravatar
Glatzemann
Administrator
Beiträge: 3230
Registriert: 08.02.2012 13:35
Wohnort: Leverkusen
Kontaktdaten:

Re: Laden und Zeichnen von Sprites

Beitragvon Glatzemann » 08.04.2015 10:32

Ein Sprite native mit DirectX zu rendern ist extrem einfach. Das Ganze so schnell wie XNA zu schaffen ist ein wenig schwieriger... Zunächst aber erstmal nur die einfache Variante:

  • Du brauchst zunächst eine orthographische Projektionsmatrix. Diese kannst du mit der Matrix-Klasse von SharpDX erzeugen.
  • Du brauchst eine Texture2D mit der Textur, die das Sprite darstellen soll.
  • Du brauchst einen Vertex Buffer (und evtl. einen Index Buffer) mit zwei Dreiecken und Texture-Koordinaten für die Texture2D
  • Du musst du RenderStates korrekt setzen (Texture-Filtering etc.)
  • Du brauchst einen einfachen Vertex- und Pixel-Shader der das Sprite mit der Texture rendert.

Näheres dazu findest du hier im Wiki. Dort gibt es einen Grundlagenartikel inkl. Beispielshader: SpriteBatch Magic: Grundlagen. Ansonsten findest du im ANX-Sourcecode eine komplette, alternative Implementierung des Sprite Batch von XNA.

Am besten schaust du dir diese Dinge mal an und kommst dann wieder mit konkreten Fragen :-)


Zurück zu „SharpDX“

Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 1 Gast