Загрузка текстур с помощью SharpDX в приложении Windows Store - PullRequest
3 голосов
/ 07 марта 2012

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

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

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

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

Ответы [ 3 ]

6 голосов
/ 15 ноября 2012

Я не уверен, что четко понял ваш вопрос, но в примерах 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;
        }
4 голосов
/ 15 сентября 2013

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

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 загружает текстуру в Windows Phone 8

2 голосов
/ 10 марта 2012

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

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

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

...