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

时间:2012-11-20 06:06:57

标签: directx sharpdx pixelformat

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

SharpDX甚至没有记录工具包的PixelFormat类型(它们有another PixelFormat class的文档,但它适用于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);

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

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

1 个答案:

答案 0 :(得分:3)

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

DXGI_FORMAT enumeration (Windows)

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

如果查看您将看到的Hardware Support for Direct3D 10Level9 Formats (Windows)页面,DirectX 9硬件上支持DXGI_FORMAT_R8G8B8A8_UNORM以及DXGI_FORMAT_B8G8R8A8_UNORM。您不会遇到与它们兼容的问题。

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