加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在Windows应用商店应用中使用SharpDX加载纹理

发布时间:2020-12-16 00:03:07 所属栏目:百科 来源:网络整理
导读:我已经将我的C#游戏从OpenTK(OpenGL)转换为SharpDX(DirectX)并从Visual Studio 2010开始运行.我还在 Windows 8开发人员预览版中使用Metro中的Visual Studio 11运行它.然而,Metro构建仍然缺乏纹理,因此我的多边形现在只是着色.问题是Metro DLL中没有用于加载
我已经将我的C#游戏从OpenTK(OpenGL)转换为SharpDX(DirectX)并从Visual Studio 2010开始运行.我还在 Windows 8开发人员预览版中使用Metro中的Visual Studio 11运行它.然而,Metro构建仍然缺乏纹理,因此我的多边形现在只是着色.问题是Metro DLL中没有用于加载图像的方法. Windows Store App中的Texture2D类(继承自Resource类)中缺少这些方法:

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

有谁知道这些最终是否会在Metro中实施?或者我可以使用另一种方法吗?请记住,在此之前我从来不知道关于DirectX或SharpDX的事情,所以我仍然非常湿透.

为SharpDX寻找任何类型的帮助或信息并不容易,这是一种耻辱,因为它似乎是使用C#在Metro中使用3D的一个很好的解决方案.

解决方法

我不确定我是否清楚地理解了你的问题,但在SharpDX示例中,我发现类’TextureLoader’有两种方法:’LoadBitmap’和’CreateTexture2DFromBitmap’.
?看,你可以使用这个函数从.bmp,.png,.jpg文件加载BitmapSource:

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 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;
        }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读