1

我正在使用CreateWICTextureFromMemoryExDirectXTK加载纹理。我加载的所有内容都转换为sRGB. 有什么方法可以强制WIC创建RGB表面吗?

或者也许有一种方法可以将已经加载的纹理从 转换sRGBRGB?回到D3DX曾经有一个D3DX11_FILTER_SRGB标志(据我了解),但它并没有被弃用。

任何帮助将不胜感激,谢谢!

4

1 回答 1

2

DirectX Tool Kit加载程序DXGI_FORMAT_*_SRGB在加载 WIC 图像时使用,原因如下:

  • PNG 文件的 WIC 元数据包含 sRGB 块(/sRGB/RenderingIntent为真)

  • JPG 的 WIC 元数据指示 sRGB(/app1/ifd/exif/{ushort=40961}为 1)

  • TIFF 的 WIC 元数据指示 sRGB(/ifd/exif/{ushort=40961}为 1)

  • 如果将“true”作为forceSRGB参数传递给函数的 Ex 版本

所以图像实际上很可能在 sRGB 颜色空间中。因此,DXGI_FORMAT_*_SRGB表示从该纹理读取的内容应该经过去伽马处理,以使它们进入线性色彩空间。我假设您在这里没有使用伽玛校正渲染?

Gamma 校正渲染是通过使用DXGI_FORMAT_*_SRGBHDR(10:10:10:2、16:16:16:16)后缓冲格式实现的。您还需要为Clear. 有关详细信息,请参阅DeviceResourcesGamma-correct renderingThe Importance of Being LinearLinear-Space Lighting(即 Gamma)

如果您控制纹理文件,一个快速简便的解决方法是使用DirectXTex库中的texconv将源图像转换为DDS. 您可以使用各种开关,例如-srgbi-srgbo强制您追求的 SRGB 行为。

请注意,我还添加了一个选项,让您在将 WICTextureLoader 用于DirectX Tool Kit的未来版本时忽略 sRGB 元数据。线性渲染是最好的,但有时最好选择避免DXGI_FORMAT_*_SRGB使用该格式。

更新: DirectX Tool Kit中较新版本的 WICTextureLoader具有以下选项标志,可帮助加载程序确定适合您的场景的正确选择:

  • WIC_LOADER_FORCE_SRGB如果格式存在,将始终返回一种*_SRGB格式。

  • WIC_LOADER_IGNORE_SRGB如果存在,加载程序会忽略上面的 WIC 颜色空间元数据。

  • 通常,如果没有 WIC 元数据,读者会认为它是线性的(即不是 sRGB)。如果您提供WIC_LOADER_SRGB_DEFAULT它,则假定缺少元数据意味着它应该是*_SRGB

于 2016-09-22T16:28:25.703 回答