Laden von Texturen auch auf Windows Phone

DirectX auf Windows Phone hat zwar zu einem großen Teil die gleiche API, wie auf dem Desktop, drum herum ist es aber z. T. stark eingeschränkt. Neben den Punkten aus den letzten Blog-Beiträgen (z. B. fehlendes Direct2D) hatte ich zusätzlich das Problem, dass ich bis jetzt fast durchweg png Dateien als Texturen verwendet habe. Grundsätzlich ja kein blöder Gedanke: Ein einfaches Dateiformat, welches man auch mit jedem Bildbearbeitungsprogramm bearbeiten und auch problemlos in eigenen Programmen verwenden kann. Auf dem Windows Phone funktioniert das aber nicht, da hierfür ausschließlich Texturen im dds Format zulässig sind. Daraus entstanden für mich im Wesentlichen zwei Probleme: Wie werden andere Dateiformate in dds konvertiert und wie können diese Dateien im Programm geladen werden?

DDS-Support in Paint.Net

Das Konvertieren der bestehenden Texturen war letzten Endes viel einfacher, als ich gedacht habe. Zugegeben, es war reiner Zufall: Ich wollte eigentlich gerade noch für ein anderes Thema ein Bild speichern und dann ist mir im Speichern-Dialog von Paint.Net aufgefallen, dass hier Bilder auch im dds Format gespeichert werden können. Nachfolgend ein Screenshot dazu.

Das nächste Problem war etwas schwieriger. In SharpDX gibt es (ohne Toolkit) leider keine Möglichkeit, direkt Texturen aus dds Dateien zu laden. Wird Google gefragt, so stößt man relativ schnell auf die Funktion D3DX11CreateShaderResourceViewFromFile, welche allerdings ebenfalls nicht in SharpDX verfügbar ist. Das Toolkit von SharpDX unterstützt aber scheinbar dds Texturen per Texture2D.Load. Ich persönlich verwende aber das Toolkit praktisch gar nicht, was die Verwendung dieser Methode schwierig macht, da sie z. B. ein GraphicsDevice benötigt, das über das Toolkit angelegt wurde. Aber dennoch: In den Quellcodes von SharpDX kann man sehen, dass Texture2D.Load im Hintergrund eine Image-Klasse verwendet, um die Bilddaten zu laden. Diese Image-Klasse kann unabhängig vom Rest des Toolkits verwendet werden, was sie für mich sehr interessant macht. So ganz nebenbei unterstützt dieser Weg auf den anderen Plattformen (Desktop, WinRT) alle relevanten Bildformate und funktioniert reibungslos. Aus diesem Grund ist dies bei mir nun auch der Standard-Weg, um Texturen zu laden. Nachfolgend das Coding, mit dem ich aktuell dss Texturen laden kann.

using (Stream inStream = source.OpenInputStream())
{
    TKGFX.Image rawImage = TKGFX.Image.Load(inStream);
    if (rawImage == null) { throw new SeeingSharpException("Unable to load image!"); }

    m_texture = GraphicsHelper.CreateTexture(device, rawImage);
}
/// <summary>
/// Creates a new image based on the given raw image data.
/// </summary>
/// <param name="device">Graphics device.</param>
/// <param name="rawImage">Raw image data.</param>
internal static D3D11.Texture2D CreateTexture(EngineDevice device, TKGFX.Image rawImage)
{
    D3D11.Texture2DDescription textureDescription = new D3D11.Texture2DDescription();
    textureDescription.Width = rawImage.Description.Width;
    textureDescription.Height = rawImage.Description.Height;
    textureDescription.MipLevels = rawImage.Description.MipLevels;
    textureDescription.ArraySize = rawImage.Description.ArraySize;
    textureDescription.Format = rawImage.Description.Format;
    textureDescription.Usage = D3D11.ResourceUsage.Default;
    textureDescription.SampleDescription = new DXGI.SampleDescription(1, 0);
    textureDescription.BindFlags = D3D11.BindFlags.ShaderResource;
    textureDescription.CpuAccessFlags = D3D11.CpuAccessFlags.None;
    textureDescription.OptionFlags = D3D11.ResourceOptionFlags.None;

    // Special handling for cube textures
    if(rawImage.Description.Dimension == TKGFX.TextureDimension.TextureCube)
    {
        textureDescription.OptionFlags = D3D11.ResourceOptionFlags.TextureCube;
    }

    return new D3D11.Texture2D(device.DeviceD3D11, textureDescription, rawImage.ToDataBox());
}

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.