Windows phone 8 SharpDX在Windows Phone 8中加载纹理

Windows phone 8 SharpDX在Windows Phone 8中加载纹理,windows-phone-8,texture2d,sharpdx,dds-format,Windows Phone 8,Texture2d,Sharpdx,Dds Format,我正在创建一个Windows Phone 8应用程序,并使用SharpDX加载纹理 我尝试使用Content.load(“filename.PNG”)加载PNG但我遇到了一些错误,我意识到Windows Phone 8中的SharpDX只接受DDS纹理,不接受PNG/JPEG/BMP等。我使用texconv filename.PNG将PNG转换为DDS,并将该文件添加到解决方案中,就像我在项目中使用的其他文件一样(我可以正确加载)。当我运行我的应用程序时,我遇到一个异常: {SharpDX.Se

我正在创建一个Windows Phone 8应用程序,并使用SharpDX加载纹理

我尝试使用
Content.load(“filename.PNG”)加载PNG
但我遇到了一些错误,我意识到Windows Phone 8中的SharpDX只接受DDS纹理,不接受PNG/JPEG/BMP等。我使用
texconv filename.PNG
将PNG转换为DDS,并将该文件添加到解决方案中,就像我在项目中使用的其他文件一样(我可以正确加载)。当我运行我的应用程序时,我遇到一个异常:

{SharpDX.Serialization.InvalidChunkException:意外的块[DDS/0x205344444]而不是[TKFX/0x58464B54]
在SharpDX.Serialization.BinarySerializer.BeginChunk(FourCC chunkId)}处

嗯,我已经使用
texconv
工具将我的有效PNG转换为DDS。据我所见,这是一个文件格式错误,而fourCC代码对应于DDS,这是应该的。但SharpDX希望使用TKFX格式(工具包效果?)而不是DDS。为什么?我正在尝试加载一个带有
内容的纹理。加载
而不是
内容。加载
(我还可以加载一个着色器,它可以完美地工作)


如果有人知道如何加载PNG而不是DDS,那就更好了

我已经解决了这个问题。我已经切换了加载纹理和加载着色器的顺序。这一次,纹理加载正确,我的着色器失败,出现以下错误:

{SharpDX.Serialization.InvalidChunkException:意外的块[TKFX/0x58464B54]而不是[TKTX/0x58544B54]
在SharpDX.Serialization.BinarySerializer.BeginChunk(FourCC chunkId)}处


它期待TKTX(可能是工具箱纹理),但得到了TKFX,这是一个着色器。我目前还没有一个解决ContentManager这种错误行为的方法,但它与DDS文件无关

我已经解决了这个问题。我已经切换了加载纹理和加载着色器的顺序。这一次,纹理加载正确,我的着色器失败,出现以下错误:

{SharpDX.Serialization.InvalidChunkException:意外的块[TKFX/0x58464B54]而不是[TKTX/0x58544B54]
在SharpDX.Serialization.BinarySerializer.BeginChunk(FourCC chunkId)}处


它期待TKTX(可能是工具箱纹理),但得到了TKFX,这是一个着色器。我目前还没有一个解决ContentManager这种错误行为的方法,但它与DDS文件无关

如果您仍然想加载PNG图像,我将在这里留下这段代码片段:

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;
}
public static Texture2D FromImage(位图图像、图形设备)
{
WriteableBitmap位图=新的WriteableBitmap(图像);
从ImageData(bitmap.Pixels、bitmap.PixelWidth、,
位图。像素高度,设备);
}
ImageData中的公共静态纹理2D(int[]数据、int宽度、int高度、GraphicsDevice设备)
{
Texture2D纹理=Texture2D.New(设备、宽度、高度、,
PixelFormat.B8G8R8A8.UNorm);
设置数据(数据);
返回纹理;
}

如果您仍然想加载PNG图像,我将把这段代码留在这里:

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;
}
public static Texture2D FromImage(位图图像、图形设备)
{
WriteableBitmap位图=新的WriteableBitmap(图像);
从ImageData(bitmap.Pixels、bitmap.PixelWidth、,
位图。像素高度,设备);
}
ImageData中的公共静态纹理2D(int[]数据、int宽度、int高度、GraphicsDevice设备)
{
Texture2D纹理=Texture2D.New(设备、宽度、高度、,
PixelFormat.B8G8R8A8.UNorm);
设置数据(数据);
返回纹理;
}

如何从PNG文件中获取可写位图?Uri=新Uri(“…”);BitmapImage位图=新的BitmapImage(uri);WriteableBitmap WriteableBitmap=新的WriteableBitmap(位图);人们过去常说这是不可能的,但现在我第一次看到从PNG读取纹理2D。它工作得很好。这个答案应该是+10左右。谢谢。如何从PNG文件中获取可写位图?Uri=新Uri(“…”);BitmapImage位图=新的BitmapImage(uri);WriteableBitmap WriteableBitmap=新的WriteableBitmap(位图);人们过去常说这是不可能的,但现在我第一次看到从PNG读取纹理2D。它工作得很好。这个答案应该是+10左右。非常感谢。