我正在使用 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);
这会在屏幕左上角绘制一个带有对角线的小矩形。它适用于我正在测试它的笔记本电脑,但我不知道如何知道这是否意味着它可以在任何地方工作,我也不知道它是否会是最高性能的。
我应该使用什么像素格式来确保我的应用程序可以在所有硬件上运行并获得最佳性能?