5

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

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

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

即使我选择了其中之一,我也需要进一步指定它是 SInt、SNorm、Typeless、UInt、UNorm 还是 UNormSRgb。我不需要 sRGB 颜色空间。我不明白无类型应该是什么。UInt 似乎是最简单的——只是一个普通的旧无符号字节——但事实证明它不起作用;我没有收到错误,但我的纹理不会在屏幕上绘制任何内容。UNorm 有效,但文档中没有任何内容可以解释 UInt 无效的原因。所以现在我很怀疑 UNorm 可能无法在其他显卡上工作。

这是我得到的代码,如果有人想看的话。下载 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);

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

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

4

1 回答 1

3

SharpDX Toolkit 中的格式映射到底层 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 功能级别)和操作系统。您必须运行自己的测试才能找到它(尽管在这些常见和相似格式的情况下,差异最多应该是个位数的百分比)。

于 2012-11-25T07:21:09.327 回答