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

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

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

最佳答案

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

  • PNG文件的WIC元数据包含sRGB块(/sRGB/RenderingIntent为true)
  • 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 校正渲染?



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

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

    10-13 09:47