使用 WIC 在 DirectX11 中将纹理加载为 RGB 而不是 sRGB
Load texture as RGB not sRGB in DirectX11 using WIC
我正在使用 DirectXTK 中的 CreateWICTextureFromMemoryEx
加载纹理。我加载的所有内容都转换为 sRGB
。有没有办法强制 WIC 创建 RGB
表面?
或者也许有一种方法可以将已加载的纹理从 sRGB
转换为 RGB
?回到 D3DX 曾经有 D3DX11_FILTER_SRGB
标志(根据我的理解)但它没有被弃用。
非常感谢任何帮助,谢谢!
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
表示从该纹理读取的数据应该经过去伽马处理,以使其进入线性色彩空间。我假设您在这里没有使用伽玛校正渲染?
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.
如果您控制纹理文件,一个快速简便的解决方法是使用 DirectXTex 库中的 texconv 将源图像转换为 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.
UPDATE:DirectX 工具包 中 WICTextureLoader 的更新版本具有以下选项标志,可帮助加载程序确定正确的选择对于您的场景:
WIC_LOADER_FORCE_SRGB
将始终 return 一种 *_SRGB
格式(如果存在一种格式)。
WIC_LOADER_IGNORE_SRGB
将让加载程序忽略上面的 WIC 色彩空间元数据(如果存在)。
通常如果没有 WIC 元数据,reader 将假定它是线性的(即不是 sRGB)。如果您提供 WIC_LOADER_SRGB_DEFAULT
,它假定缺少元数据意味着它应该是 *_SRGB
。
我正在使用 DirectXTK 中的 CreateWICTextureFromMemoryEx
加载纹理。我加载的所有内容都转换为 sRGB
。有没有办法强制 WIC 创建 RGB
表面?
或者也许有一种方法可以将已加载的纹理从 sRGB
转换为 RGB
?回到 D3DX 曾经有 D3DX11_FILTER_SRGB
标志(根据我的理解)但它没有被弃用。
非常感谢任何帮助,谢谢!
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
表示从该纹理读取的数据应该经过去伽马处理,以使其进入线性色彩空间。我假设您在这里没有使用伽玛校正渲染?
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 forClear
. See DeviceResources, Gamma-correct rendering, The Importance of Being Linear, and Linear-Space Lighting (i.e. Gamma) for details.
如果您控制纹理文件,一个快速简便的解决方法是使用 DirectXTex 库中的 texconv 将源图像转换为 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.
UPDATE:DirectX 工具包 中 WICTextureLoader 的更新版本具有以下选项标志,可帮助加载程序确定正确的选择对于您的场景:
WIC_LOADER_FORCE_SRGB
将始终 return 一种*_SRGB
格式(如果存在一种格式)。WIC_LOADER_IGNORE_SRGB
将让加载程序忽略上面的 WIC 色彩空间元数据(如果存在)。通常如果没有 WIC 元数据,reader 将假定它是线性的(即不是 sRGB)。如果您提供
WIC_LOADER_SRGB_DEFAULT
,它假定缺少元数据意味着它应该是*_SRGB
。