好的,我正在尝试权衡使用各种不同的纹理压缩技术的优点和缺点。我花费99.999%的时间编写Windows机器上使用DirectX的2D精灵游戏。
到目前为止,我已经看过了使用alpha-trimming的纹理打包(SpriteSheets),这似乎是获得更高性能的不错方法。现在我开始研究存储它们的纹理格式;目前所有东西都以*.PNGs的形式存储。
我听说*.DDS文件很好,特别是在与DXT5(/3/1取决于任务)压缩一起使用时,因为纹理保持在VRAM中压缩?此外,人们说它们已经是DirectDraw表面,所以加载速度非常快。
因此,我创建了一个应用程序来测试它。我调用下面的代码20次,在每个调用之间释放纹理。
for (int i = 0; i < 20; i++)
{
if( FAILED( D3DXCreateTextureFromFile( g_pd3dDevice, L"Test.dds", &g_pTexture ) ) )
{
return E_FAIL;
}
g_pTexture->Release();
g_pTexture = NULL;
}
现在,如果我使用DXT5纹理尝试这个操作,它需要比简单的*.PNG加载慢5倍的时间才能完成。我听说如果不生成Mipmaps,速度会变慢,所以我仔细检查了一下。然后我更改了用于生成*.DDS文件的程序,改用NVIDIA自己的nvcompress.exe,但没有任何效果。
编辑:我忘记提到这两个文件(*.png和*.dds)都是相同的图像,只是以不同的格式保存。(大小、alpha数量等都相同!)
编辑2:当使用以下参数时,加载速度几乎快了2.5倍,并且消耗的VRAM要少得多!
D3DXCreateTextureFromFileEx( g_pd3dDevice, L"Test.dds", D3DX_DEFAULT_NONPOW2, D3DX_DEFAULT_NONPOW2, D3DX_FROM_FILE, 0, D3DFMT_FROM_FILE, D3DPOOL_MANAGED, D3DX_FILTER_NONE, D3DX_FILTER_NONE, 0, NULL, NULL, &g_pTexture )
然而,我的纹理现在失去了所有的透明度,我查看了DXT5纹理,在Paint.NET和DirectX DDS Viewer中看起来很好。但是,当加载时,所有的透明度都变成了纯黑色。颜色键问题?
编辑3:忽略上面的内容,我很蠢,在我的“快速示例”中,我忘记在D3DXSprite->Begin()上启用Alpha-Blending了。天啊!