2012-03-07 21 views
2

OpenTK(OpenGL)からSharpDX(DirectX)にC#のゲームを変換し、Visual Studio 2010から起動して実行しています。 Metro、Windows 8 Developer Previewにあります。しかし、Metroビルドにはまだテクスチャがないので、私のポリゴンは今のところ色づけされています。問題は、イメージをロードするために使用されたメソッドがメトロDLLに存在しないことです。これらのメソッドは、すべてのWindowsストアアプリの中で(リソースクラスから継承)にTexture2Dクラスから欠落している。これらは最終的にはメトロで実装される場合SharpDXでテクスチャをWindowsストアに読み込む

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

誰でも知っていますか?または、私が使用できる別の方法がありますか?この前にDirectXやSharpDXについて知ったことは一度もなかったことを覚えておいてください。

SharpDXのヘルプや情報を見つけることは簡単ではありません。これは、C#を使用したMetroの3Dにとって最適なソリューションだと思われるため、残念です。

+0

、彼らはここの人々よりも、将来の計画をより意識するでしょう。 – ssube

+0

彼らは独自のフォーラムやメーリングリストを持っていないようです。 =/http://code.google.com/p/sharpdx/ – msedore

+0

これは愚かです。あなたは問題を提出する可能性がありますか?私はそこにかなり最近のものをいくつか見るが、彼らが応答するかどうかは分からない。 – ssube

答えて

2

いいニュースです! SharpDXの著者Alexandre Mutelは、MicrosoftがDirect3D11から「ヘルパーメソッド」を削除したことを知らせてくれました。 SharpDXによる脱落ではありませんでした。そして、彼はまた正しい方向に私を指摘しました。 WICを使用してテクスチャを読み込む私はちょうど方法の2必要

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

::LoadBitmap()とCreateTex2DFromBitmap()私は、サンプルコードをここを見つけました。私は "R8G8B8A8_UNorm_SRgb"を "R8G8B8A8_UNorm"に変更しなければなりませんでしたが、最終的には動作しました。そして今、私のゲームは、メトロで見事に見えます。 :)

6

私はあなたの質問をはっきりと理解していますが、SharpDXサンプルでは、​​ 'LoadBitmap'と 'CreateTexture2DFromBitmap'という2つのメソッドを持つクラス 'TextureLoader'が見つかりました。 見て、あなたはファイルをJPG、PNG、.BMPからした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 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; 
    } 

たBitmapSourceからにTexture2Dを取得するには、これを使用することができます

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

あなたはまたのBitmapImage(それはメトロで動作するからそれらを作成することができ、メトロでテクスチャをロードするためにWICを使用する必要はありませんとはあまりコンプです:それはより簡単に、私はこの関数を作成しました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

関連する問題