我使用 DirectXTK 中的CreateWICTextureFromMemoryEx
加载纹理。我加载的所有内容都转换为sRGB
。有没有办法强制 WIC 来创建RGB
表面?
或许有一种方法可以将已加载的纹理从sRGB
转换为RGB
?回到 D3DX ,曾经有D3DX11_FILTER_SRGB
标志(根据我的理解),但它没有被弃用。
非常感谢任何帮助,谢谢!
答案 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
使用线性颜色。有关详细信息,请参阅DeviceResources,Gamma-correct rendering,The Importance of Being Linear和Linear-Space Lighting (i.e. Gamma)。
如果您控制纹理文件,则快速简便的解决方法是使用 DirectXTex 库中的texconv将源图像转换为DDS
。您可以使用-srgbi
或-srgbo
等各种开关强制执行您的SRGB行为。
请注意,我还添加了一个选项,让您在将来的DirectX Tool Kit版本中使用WICTextureLoader时忽略sRGB元数据。线性渲染是最好的,但有时可以选择避免使用
DXGI_FORMAT_*_SRGB
格式。