2011-03-01 16 views
6

Estoy tratando de usar SharpDX para crear un programa 2D simple y laberinto usando DirectX.Cargando/Creando una imagen en SharpDX en un programa .NET

Para ello quiero crear mapas de bits que puede hacer que en la pantalla para las paredes, pasillos, fuera del laberinto, etc.

Sin embargo, me parece que no puede encontrar la manera de carga, ya sea un archivo de imagen existente en la clase Bitmap en la biblioteca SharpDX, o cómo crear una clase nueva de Bitmap desde cero.

Dado que se dice que todas las clases se asignan directamente a los tipos de DirectX, supongo que esto solo significa que necesito aprender más DirectX, pero esperaba que hubiera un ejemplo simple en alguna parte que pudiera mostrarme lo que tenía que hacer.

Si tengo que construir un nuevo mapa de bits desde cero y dibujarlo, puedo hacerlo, no es difícil obtener los píxeles que necesito, sin embargo, ni siquiera puedo entender esa parte.

¿Alguien tiene alguna experiencia con la biblioteca SharpDX y me puede dar algunos consejos?

Respuesta

8

Debería formular directamente esta pregunta en la pestaña "Emitir" del proyecto Sharpdx, ya que podría darle una respuesta rápida desde allí (tiene suerte de que a veces verifique su uso de la red;)) Si lo hiciera oficialmente, podría mejorar la biblioteca y mantener un registro de su solicitud en la base de datos de problemas.

En cuanto a su problema particular, no está claro qué tipo de API de DirectX está utilizando. Supongo que estás usando Direct2D?

En caso afirmativo, no hay una API para cargar directamente un SharpDX.Direct2D1.Bitmap desde un archivo (agregaré este método a la API). Acabo de subir un bitmap sample que está realizando esto.

/// <summary> 
/// Loads a Direct2D Bitmap from a file using System.Drawing.Image.FromFile(...) 
/// </summary> 
/// <param name="renderTarget">The render target.</param> 
/// <param name="file">The file.</param> 
/// <returns>A D2D1 Bitmap</returns> 
public static Bitmap LoadFromFile(RenderTarget renderTarget, string file) 
{ 
    // Loads from file using System.Drawing.Image 
    using (var bitmap = (System.Drawing.Bitmap)System.Drawing.Image.FromFile(file)) 
    { 
     var sourceArea = new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height); 
     var bitmapProperties = new BitmapProperties(new PixelFormat(Format.R8G8B8A8_UNorm, AlphaMode.Premultiplied)); 
     var size = new System.Drawing.Size(bitmap.Width, bitmap.Height); 

     // Transform pixels from BGRA to RGBA 
     int stride = bitmap.Width * sizeof(int); 
     using (var tempStream = new DataStream(bitmap.Height * stride, true, true)) 
     { 
      // Lock System.Drawing.Bitmap 
      var bitmapData = bitmap.LockBits(sourceArea, ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppPArgb); 

      // Convert all pixels 
      for (int y = 0; y < bitmap.Height; y++) 
      { 
       int offset = bitmapData.Stride*y; 
       for (int x = 0; x < bitmap.Width; x++) 
       { 
        // Not optimized 
        byte B = Marshal.ReadByte(bitmapData.Scan0, offset++); 
        byte G = Marshal.ReadByte(bitmapData.Scan0, offset++); 
        byte R = Marshal.ReadByte(bitmapData.Scan0, offset++); 
        byte A = Marshal.ReadByte(bitmapData.Scan0, offset++); 
        int rgba = R | (G << 8) | (B << 16) | (A << 24); 
        tempStream.Write(rgba); 
       } 

      } 
      bitmap.UnlockBits(bitmapData); 
      tempStream.Position = 0; 

      return new Bitmap(renderTarget, size, tempStream, stride, bitmapProperties); 
     } 
    } 
} 

Como usted ha dicho, SharpDX está dando acceso a la API DirectX-bajo nivel de prima (a diferencia, por ejemplo, XNA que está dando una API de alto nivel), por lo que definitivamente necesita entender cómo el programa de DirectX prima con el fin para usar SharpDX.

0

Cuando estaba usando SlimDX, me encontré con el mismo problema (cargando un mapa de bits con Direct2D) y encontré una solución similar que elimina el bucle incrustado y requiere un código un poco menor; convertirlo a SharpDX fue una cuestión simple. (Desearía poder decirle dónde encontré el original, pero han pasado años y al parecer no he documentado la fuente. Podría ser directamente de las muestras de SlimDX por lo que sé).

Dejé los espacios de nombres intacto para que sepa exactamente dónde se define cada tipo. Además, algunos de los parámetros (particularmente los de PixelFormat) son flexibles; juega con ellos y usa lo que sea que funcione para ti.

 
private Bitmap Load(string filename) 
{ 
    System.Drawing.Bitmap bmp = (System.Drawing.Bitmap)System.Drawing.Image.FromFile(filename); 

    System.Drawing.Imaging.BitmapData bmpData = 
     bmp.LockBits(
      new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height), 
      System.Drawing.Imaging.ImageLockMode.ReadOnly, 
      System.Drawing.Imaging.PixelFormat.Format32bppPArgb); 

    SharpDX.DataStream stream = new SharpDX.DataStream(bmpData.Scan0, bmpData.Stride * bmpData.Height, true, false); 
    SharpDX.Direct2D1.PixelFormat pFormat = new SharpDX.Direct2D1.PixelFormat(SharpDX.DXGI.Format.B8G8R8A8_UNorm, AlphaMode.Premultiplied); 
    SharpDX.Direct2D1.BitmapProperties bmpProps = new SharpDX.Direct2D1.BitmapProperties(pFormat); 

    SharpDX.Direct2D1.Bitmap result = 
     new SharpDX.Direct2D1.Bitmap(
      m_renderTarget, 
      new SharpDX.Size2(bmp.Width, bmp.Height), 
      stream, 
      bmpData.Stride, 
      bmpProps); 

    bmp.UnlockBits(bmpData); 

    stream.Dispose(); 
    bmp.Dispose(); 

    return result; 
} 

Como se puede ver, se bloquea el flujo de mapa de bits tanto como el enfoque de Alexandre (que se utiliza en el proyecto de ejemplo SharpDX asociado), pero en lugar de copiar manualmente cada píxel, el constructor se copia en la corriente detrás de las escenas . No comparé el rendimiento con el método que ha propuesto Alexandre, así que no puedo decir qué método es más rápido, pero este es bastante rápido para mis propósitos, y el código está limpio.

(Lo siento por la falta de resaltado de sintaxis;. < el código de etiqueta > por alguna razón me rompe el fragmento en secciones)

Cuestiones relacionadas