gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 15:46:18 25 4
gpt4 key购买 nike

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

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

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

即使我选择了其中之一,我也需要进一步指定它是 SInt、SNorm、Typeless、UInt、UNorm 还是 UNormSRgb。我不需要 sRGB 色彩空间。我不明白 Typeless 的用途。 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);

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

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

最佳答案

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

关于directx - 创建新的Texture2D时如何选择像素格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13467463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com