gpt4 book ai didi

c++ - 使用 WIC 在 DirectX11 中将纹理加载为 RGB 而不是 sRGB

转载 作者:行者123 更新时间:2023-11-30 05:22:29 27 4
gpt4 key购买 nike

我正在使用 CreateWICTextureFromMemoryExDirectXTK 加载纹理。我加载的所有内容都转换为 sRGB。有没有办法强制 WIC 创建 RGB 表面?

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

非常感谢任何帮助,谢谢!

最佳答案

DirectX Tool Kit 加载器在加载 WIC 图像时使用 DXGI_FORMAT_*_SRGB 有几个原因:

  • PNG 文件的 WIC 元数据包含 sRGB block (/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 处理,以使其进入线性色彩空间。我假设您在这里没有使用 Gamma 校正渲染?

Gamma-correct rendering is achieved by using a DXGI_FORMAT_*_SRGB or HDR (10:10:10:2, 16:16:16:16) backbuffer format. You also need to use linear colors for Clear. See DeviceResources, Gamma-correct rendering, The Importance of Being Linear, and Linear-Space Lighting (i.e. Gamma) for details.

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

Note that I'm also adding an option to let you ignore the sRGB metadata when using WICTextureLoader for a future release of DirectX Tool Kit. Linear rendering is best, but sometimes it's nice to have the option to avoid the DXGI_FORMAT_*_SRGB format being used.

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

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

  • WIC_LOADER_IGNORE_SRGB 将使加载程序忽略上面的 WIC 色彩空间元数据(如果存在)。

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

关于c++ - 使用 WIC 在 DirectX11 中将纹理加载为 RGB 而不是 sRGB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39634189/

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