首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在创建新的Texture2D时选择像素格式?

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

Stack Overflow用户
提问于 2012-11-20 14:06:57
回答 1查看 5.8K关注 0票数 5

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

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

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

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

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

代码语言:javascript
复制
// 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);

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-25 15:21:09

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

DXGI_FORMAT enumeration (Windows)

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

如果您查看Hardware Support for Direct3D 10Level9 Formats (Windows)页面,您将看到DXGI_FORMAT_R8G8B8A8_UNORM和DXGI_FORMAT_B8G8R8A8_UNORM在DirectX 9硬件上都受支持。你不会遇到兼容性问题--两者都有问题。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13467463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档