创建新的Texture2D时如何选择像素格式?

Joe*_*ite 5 directx pixelformat sharpdx

我正在使用SharpDX Toolkit,我正在尝试以编程方式创建Texture2D,因此我可以手动指定所有像素值.我不确定用它创建什么像素格式.

SharpDX甚至没有记录工具包的PixelFormat类型(他们有另一个PixelFormat类的文档,但它适用于WIC,而不是工具包).我确实找到了它包装的DirectX枚举,DXGI_FORMAT,但它的文档没有给我如何选择格式的任何有用的指导.

我习惯于使用每个颜色通道8位加8位alpha的旧32位位图格式,这对我来说已经足够了.所以我猜最简单的选择是R8G8B8A8或B8G8R8A8.我选择哪个重要?它们都将在所有硬件上得到完全支持吗?

甚至一旦我选择了其中之一,我就需要进一步指定它是SInt,SNorm,Typeless,UInt,UNorm还是UNormSRgb.我不需要sRGB色彩空间.我不明白Typeless应该是什么.UInt似乎是最简单的 - 只是一个普通的无符号字节 - 但事实证明它不起作用; 我没有收到错误,但我的纹理不会在屏幕上绘制任何内容.UNorm有效,但文档中没有任何内容可以解释为什么UInt没有.所以现在我很偏执,因为它可能无法在其他视频卡上运行.

这是我得到的代码,如果有人想看到的话.下载SharpDX完整包,打开SharpDXToolkitSamples项目,转到SpriteBatchAndFont.WinRTXaml项目,打开SpriteBatchAndFontGame类,并在指示的位置添加代码:

// Add new field to the class:
private Texture2D _newTexture;

// Add at the end of the LoadContent method:
_newTexture = Texture2D.New(GraphicsDevice, 8, 8, PixelFormat.R8G8B8A8.UNorm);
var colorData = new Color[_newTexture.Width*_newTexture.Height];
_newTexture.GetData(colorData);
for (var i = 0; i < colorData.Length; ++i)
    colorData[i] = (i%3 == 0) ? Color.Red : Color.Transparent;
_newTexture.SetData(colorData);

// Add inside the Draw method, just before the call to spriteBatch.End():
spriteBatch.Draw(_newTexture, new Vector2(0, 0), Color.White);
Run Code Online (Sandbox Code Playgroud)

这会在屏幕的左上角绘制一个带有对角线的小矩形.它适用于笔记本电脑我正在测试它,但我不知道如何知道这是否意味着它将在任何地方工作,我也不知道它是否会是最高性能的.

我应该使用什么像素格式来确保我的应用程序可以在所有硬件上运行,并获得最佳性能?

Jen*_*lte 3

SharpDX 工具包中的格式映射到底层 DirectX/DXGI 格式,因此您可以像使用 Microsoft 产品一样,从 MSDN 获取信息:

DXGI_FORMAT 枚举 (Windows)

32 位纹理是大多数纹理场景的常见选择,并且在较旧的硬件上具有良好的性能。正如评论中已经回答的那样,UNorm 的意思是“在 0.0 .. 1.0 的范围内”,并且也是访问纹理中颜色数据的常用方法。

如果您查看Direct3D 10Level9 格式的硬件支持 (Windows)页面,您将看到 DirectX 9 硬件支持 DXGI_FORMAT_R8G8B8A8_UNORM 以及 DXGI_FORMAT_B8G8R8A8_UNORM。您不会遇到两者的兼容性问题。

性能取决于您的设备的初始化方式(RGBA/BGRA?)以及您运行软件的硬件(=支持的 DX 功能级别)和操作系统。您必须运行自己的测试才能找到答案(尽管在这些常见且相似的格式的情况下,差异最多应该是个位数百分比)。