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

时间:2016-09-22 08:41:19

标签: c++ directx directx-11 wic srgb

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

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

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

1 个答案:

答案 0 :(得分:1)

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

  • 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表示从该纹理读取应该使de-gamma进入线性颜色空间。我假设你没有在这里使用伽马校正渲染?

  

通过使用DXGI_FORMAT_*_SRGB或HDR(10:10:10:2,16:16:16:16)后备缓冲格式实现伽玛校正渲染。您还需要为Clear使用线性颜色。有关详细信息,请参阅DeviceResourcesGamma-correct renderingThe Importance of Being LinearLinear-Space Lighting (i.e. Gamma)

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

  

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