我正在使用CreateWICTextureFromMemoryEx
DirectXTK加载纹理。我加载的所有内容都转换为sRGB
. 有什么方法可以强制WIC创建RGB
表面吗?
或者也许有一种方法可以将已经加载的纹理从 转换sRGB
为RGB
?回到D3DX曾经有一个D3DX11_FILTER_SRGB
标志(据我了解),但它并没有被弃用。
任何帮助将不胜感激,谢谢!
我正在使用CreateWICTextureFromMemoryEx
DirectXTK加载纹理。我加载的所有内容都转换为sRGB
. 有什么方法可以强制WIC创建RGB
表面吗?
或者也许有一种方法可以将已经加载的纹理从 转换sRGB
为RGB
?回到D3DX曾经有一个D3DX11_FILTER_SRGB
标志(据我了解),但它并没有被弃用。
任何帮助将不胜感激,谢谢!
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_*_SRGB
HDR(10:10:10:2、16:16:16:16)后缓冲格式实现的。您还需要为Clear
. 有关详细信息,请参阅DeviceResources、Gamma-correct rendering、The Importance of Being Linear和Linear-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
。