1

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

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

{SharpDX.Serialization.InvalidChunkException: Unexpected chunk [DDS /0x20534444] instead of [TKFX/0x58464B54] at SharpDX.Serialization.BinarySerializer.BeginChunk(FourCC chunkId)}

好吧,我已经使用该texconv工具将我的有效 PNG 转换为 DDS。我看是文件格式错误,fourCC码对应的是DDS,应该是这样的。但是 SharpDX 期望 TKFX 格式(工具包效果?)而不是 DDS。为什么?我正在尝试使用Content.Load<Texture2D>not加载纹理Content.Load<Effect>(我也有它来加载着色器并且它工作得很好)。

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

4

2 回答 2

5

如果您仍想加载 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;
}
于 2013-09-11T11:51:17.197 回答
0

我已经弄清楚了问题所在。我已经切换了加载纹理和加载着色器的顺序。这一次,纹理加载正确,我的着色器因以下错误而失败:

{SharpDX.Serialization.InvalidChunkException: Unexpected chunk [TKFX/0x58464B54] instead of [TKTX/0x58544B54] at SharpDX.Serialization.BinarySerializer.BeginChunk(FourCC chunkId)}

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

于 2013-07-16T17:07:17.337 回答