首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用WIC将纹理加载为RGB而不是sRGB在DirectX11中

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

Stack Overflow用户
提问于 2016-09-22 08:41:19
回答 1查看 2.4K关注 0票数 1

我正在使用CreateWICTextureFromMemoryExDirectXTK加载纹理。加载的所有内容都转换为sRGB。有没有办法强迫WIC创建RGB曲面?

或者有一种方法可以将已经加载的纹理从sRGB转换为RGB?在D3DX中,曾经有一个D3DX11_FILTER_SRGB标志(据我所知),但并不反对。

任何帮助都将是非常感谢的,谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-22 16:28:25

DirectX工具包加载器在加载DXGI_FORMAT_*_SRGB图像时使用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-γ的约束,才能使它们进入线性颜色空间。我假设你在这里没有使用伽马正确的渲染?

使用DXGI_FORMAT_*_SRGB或HDR (10:10:10:2,16:16: 16:16:16:16)来实现伽马-正确渲染。您还需要为Clear使用线性颜色。有关详细信息,请参阅DeviceResources伽马校正渲染线性的重要性线性空间照明(即伽玛)

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

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

UPDATE:最新版本的DirectX工具包中的WICTextureLoader有以下选项标志,这些标志帮助加载程序确定适合您的场景的正确选择:

  • 如果存在*_SRGB格式,则该格式将始终返回*_SRGB格式。
  • 如果存在,WIC_LOADER_IGNORE_SRGB将让加载程序忽略上面的Will元数据。
  • 通常,如果没有WIC元数据,读取器将假定它是线性的(即不是sRGB)。如果您提供WIC_LOADER_SRGB_DEFAULT,它假设缺少元数据意味着它应该是*_SRGB
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39634189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档