2012-03-07 11 views
2

Я конвертировал свою игру C# из OpenTK (OpenGL) в SharpDX (DirectX) и запускаю ее из Visual Studio 2010. Я также запускаю ее из Visual Studio 11 в Metro, в Windows 8 Developer Preview. Тем не менее, Metro build по-прежнему не хватает текстур, поэтому мои полигоны просто окрашены прямо сейчас. Проблема в том, что методы, используемые для загрузки изображений, отсутствуют в DLL Metro. Эти методы все недостающие из класса Texture2D (унаследованный от класса ресурсов) в Windows Store App:Загрузка текстур с помощью SharpDX в Windows Store App

SharpDX.Direct3D11.Resource.FromStream 
SharpDX.Direct3D11.Resource.FromFile 
SharpDX.Direct3D11.Resource.FromMemory 

Кто-нибудь знает, если это будет в конечном итоге будет реализован в метро? Или есть альтернативный подход, который я мог бы использовать? Пожалуйста, имейте в виду, что до этого я никогда не знал ничего о DirectX или SharpDX, поэтому я все еще очень мокрым за ушами со всем этим.

Найти какую-либо помощь или информацию для SharpDX непросто, что является позором, потому что это кажется отличным решением для 3D в Metro с использованием C#.

+0

Это может быть лучше размещен на их форум или список рассылки, они будут более осведомлены о планах на будущее, чем люди здесь. – ssube

+0

У них нет собственного форума или списка рассылки. =/http://code.google.com/p/sharpdx/ – msedore

+0

Это глупо. Может быть, вы можете подать вопрос? Я вижу несколько довольно недавних, но не знаю, реагируют ли они. – ssube

ответ

2

Хорошие новости! Alexandre Mutel, автор SharpDX, сообщите мне, что Microsoft удалила «вспомогательные методы» из Direct3D11. SharpDX не был упущен. И он указал мне в правильном направлении; использовать WIC для загрузки моих текстур. Я нашел пример кода здесь:

http://crazylights.googlecode.com/svn/CLReach/win8/SDX_CLGC/clgc.cs

мне просто нужно два из методов: LoadBitmap() и CreateTex2DFromBitmap(). Мне пришлось изменить «R8G8B8A8_UNorm_SRgb» на «R8G8B8A8_UNorm», но в итоге я получил его работу. И теперь моя игра теперь выглядит потрясающе в метро со всеми ее текстурами на месте! :)

6

Я не уверен, что я четко понял ваш вопрос, но в образцах SharpDX я нашел класс TextureLoader, который имеет два метода: «LoadBitmap» и «CreateTexture2DFromBitmap». Посмотрите, вы можете использовать эту функцию для загрузки BitmapSource из .bmp, .png, .jpg файлы:

public static BitmapSource LoadBitmap(ImagingFactory2 factory, string filename) 
    { 
     var bitmapDecoder = new SharpDX.WIC.BitmapDecoder(
      factory, 
      filename, 
      SharpDX.WIC.DecodeOptions.CacheOnDemand 
      ); 

     var result = new SharpDX.WIC.FormatConverter(factory); 

     result.Initialize(
      bitmapDecoder.GetFrame(0), 
      SharpDX.WIC.PixelFormat.Format32bppPRGBA, 
      SharpDX.WIC.BitmapDitherType.None, 
      null, 
      0.0, 
      SharpDX.WIC.BitmapPaletteType.Custom); 

     return result; 
    } 

Чтобы получить Texture2D от BitmapSource вы можете использовать это:

public static Texture2D CreateTexture2DFromBitmap(Device device, BitmapSource bitmapSource) 
    { 
     // Allocate DataStream to receive the WIC image pixels 
     int stride = bitmapSource.Size.Width * 4; 
     using (var buffer = new SharpDX.DataStream(bitmapSource.Size.Height * stride, true, true)) 
     { 
      // Copy the content of the WIC to the buffer 
      bitmapSource.CopyPixels(stride, buffer); 
      return new SharpDX.Direct3D11.Texture2D(device, new SharpDX.Direct3D11.Texture2DDescription() 
      { 
       Width = bitmapSource.Size.Width, 
       Height = bitmapSource.Size.Height, 
       ArraySize = 1, 
       BindFlags = SharpDX.Direct3D11.BindFlags.ShaderResource, 
       Usage = SharpDX.Direct3D11.ResourceUsage.Immutable, 
       CpuAccessFlags = SharpDX.Direct3D11.CpuAccessFlags.None, 
       Format = SharpDX.DXGI.Format.R8G8B8A8_UNorm, 
       MipLevels = 1, 
       OptionFlags = SharpDX.Direct3D11.ResourceOptionFlags.None, 
       SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0), 
      }, new SharpDX.DataRectangle(buffer.DataPointer, stride)); 
     } 
    } 

и для того, чтобы чтобы было легче, я создал эту функцию:

 public static Texture2D LoadFromFile(Device device, ImagingFactory2 factory, string fileName) 
     { 
      var bs = LoadBitmap(factory, fileName); 
      var texture = CreateTexture2DFromBitmap(device, bs); 
      return texture; 
     } 
3

Вам не нужно использовать WIC для загрузки текстур в метро, ​​вы также можете создать их из BitmapImage (она работает в метро и меньше компа licated):

public static Texture2D FromImage(BitmapImage image, GraphicsDevice device) 
{ 
    WriteableBitmap bitmap = new WriteableBitmap(image); 

    return FromImageData(bitmap.Pixels, bitmap.PixelWidth, 
          bitmap.PixelHeight, device); 
} 

public static Texture2D FromImageData(int[] data, int width, int height, GraphicsDevice device) 
{ 
    Texture2D texture = Texture2D.New(device, width, height, 
            PixelFormat.B8G8R8A8.UNorm); 

    texture.SetData<int>(data); 

    return texture; 
} 

Смотрите мой ответ здесь: SharpDX load a texture in Windows Phone 8