www.rolandk.de
- Aktuelle Themen zu .Net -
Achtung: Hier handelt es sich um meine alte Seite.
Die aktuelle ist unter folgendem Link erreichbar: www.rolandk.de/wp/
Home Blog In SlimDX (DirectX 11) eine Textur aus einem Bitmap erzeugen




















































In SlimDX (DirectX 11) eine Textur aus einem Bitmap erzeugen
Sonntag, den 03. Oktober 2010 um 09:44 Uhr

SlimDX bietet dem C# Entwickler sehr viele Features der API von DirectX. Allerdings fehlen einige Funktionen, die ein .Net Entwickler in vielen Fällen braucht. So habe ich etwa nach einer Funktion gesucht, die ein System.Drawing.Bitmap in eine Textur umwandelt - vergebens. Das ältere ManagedDirectX von Microsoft hatte eine solche Funktion noch.

Die Lösung ist ähnlich der, die ich schon im Direct2D-Tutorial auf dieser Seite beschrieben habe: Man muss es einfach selber machen. Folgendes Coding erfüllt diese Aufgabe:

 

  1. public static D3D11.Texture2D TextureFromBitmap(D3D11.Device device, Bitmap bitmap)
  2. {
  3. D3D11.Texture2D result = null;
  4.  
  5. //Lock bitmap so it can be accessed for texture loading
  6. BitmapData bitmapData = bitmap.LockBits(
  7. new Rectangle(0, 0, bitmap.Width, bitmap.Height),
  8. ImageLockMode.ReadOnly, PixelFormat.Format32bppPArgb);
  9. DataStream dataStream = new DataStream(
  10. bitmapData.Scan0,
  11. bitmapData.Stride * bitmapData.Height,
  12. true, false);
  13. DataRectangle dataRectangle = new DataRectangle(bitmapData.Stride, dataStream);
  14.  
  15. try
  16. {
  17. //Load the texture
  18. result = new D3D11.Texture2D(device, new D3D11.Texture2DDescription()
  19. {
  20. BindFlags = D3D11.BindFlags.ShaderResource,
  21. CpuAccessFlags = D3D11.CpuAccessFlags.None,
  22. Format = DXGI.Format.B8G8R8A8_UNorm,
  23. OptionFlags = D3D11.ResourceOptionFlags.None,
  24. MipLevels = 1,
  25. Usage = D3D11.ResourceUsage.Immutable,
  26. Width = bitmap.Width,
  27. Height = bitmap.Height,
  28. ArraySize = 1,
  29. SampleDescription = new DXGI.SampleDescription(1, 0)
  30. }, dataRectangle);
  31. }
  32. finally
  33. {
  34. //Free bitmap-access resources
  35. dataStream.Dispose();
  36. bitmap.UnlockBits(bitmapData);
  37. }
  38.  
  39. return result;
  40. }

Sieht auf den ersten Blick kompliziert aus, ist es aber gar nicht. Zuerst greifen wir per Lock auf die Binärdaten der Bitmap zu und schreiben diese dann direkt in eine neue DirectX 11 Textur. Aufpassen muss man nur mit den Pixel-Formaten, diese müssen nämlich kompatibel sein. Anderenfalls sieht das Ergebnis entweder komisch aus (andere Farben etc.) oder der Kopiervorgang bricht mit einer Exception ab. Getestet habe ich diese Funktion mit einem Beispielprogramm, dass die Textur aus einer Bitmap lädt, die innerhalb der Resourcendatei des Beispielprojekts gespeichert ist. Nachfolgend ein kleiner Screenshot.

 

 

 

Kommentar hinzufügen

Ihr Name:
Kommentar:

Kommentare (2)

2. Thomas
Sonntag, den 28. Februar 2016 um 08:34 Uhr
Das ist viel schneller als wenn man das Bild in einen MemoryStream speichert und daraus die Textur lädt.

Geht das auch in die andere Richtung: Ein Bild aus einer Textur erzeugen ???

1. Kevin
Samstag, den 05. Mai 2012 um 21:20 Uhr
Super, vielen Dank. Ich hab vorher bestimmt ne halbe Stunde das Internet danach durchforstet. In SharpDX muss man übrigens noch eine Kleinigkeit verändern, um es dann zum laufen zu bringen:

DataRectangle dataRectangle = new DataRectangle(dataStream.DataPointer, bitmapData.Stride);