gpt4 book ai didi

graphics - DXGI_FORMAT 的确切颜色空间是什么?

转载 作者:行者123 更新时间:2023-12-02 02:09:36 25 4
gpt4 key购买 nike

在DXGI_FORMAT的官方文档中,告诉我们只有带有_SRGB枚举后缀的格式才属于sRGB色彩空间。我认为没有这个后缀的其他格式都在线性空间中。但是我在 DirectXTex 库中发现了格式转换函数的一个很奇怪的行为。 (您可以从 http://directxtex.codeplex.com/ 下载)

首先,我使用NVIDIA Photoshop DDS Plugin将纹理文件导出为DXGI_FORMAT_R32G32B32A32_FLOAT。然后我通过 LoadFromDDSFile() 函数加载这个文件,并通过 Convert() 函数将其格式转换为 DXGI_FORMAT_R16G16B16A16_UNORM。 (这两个函数都是由 DirectXTex 库提供的。)

你猜怎么着?图像转换为DXGI_FORMAT_R16G16B16A16_UNORM后,所有像素的亮度也发生了变化,整个图像变得比以前更亮了。

如果在图像转换为 DXGI_FORMAT_R16G16B16A16_UNORM 格式后手动将像素值从 sRGB 空间转换为线性空间,则生成的像素值与输入相同。因此,我假设 DirectXTex 库将 DXGI_FORMAT_R32G32B32A32_FLOAT 视为线性色彩空间中的格式,并将 DXGI_FORMAT_R16G16B16A16_UNORM 视为 sRGB 色彩空间中的格式,然后将色彩空间从线性空间转换为 sRGB 空间。 (我试图找出为什么Convert()函数也会转换颜色空间,但它是由WIC实现的,并且没有它的源代码。)

那么,DirectXTex 库中是否有任何错误?或者它是 DXGI_FORMAT 的真正标准?如果某些特殊的 DXGI_FORMAT 有不同的颜色空间,请告诉我在哪里可以找到它的规范。

任何帮助将不胜感激。谢谢!

最佳答案

按照惯例,浮点 RGB 值是线性的,整数 RGB 值是 Gamma 压缩的。 Gamma 压缩浮点数没有特别的好处,因为 Gamma 的原因是在感知上需要使用更多位,并且浮点数在整个过程中具有足够(可能过多)的位数并且已经是伪对数编码(使用指数) . ( source )

请注意,DXGI 中整数 RGB 纹理的颜色空间(不是专门的 *_SRGB)不是 sRGB,它取决于驱动程序,并且通常具有固定的 0.5 Gamma 值。

DirectXTex 库似乎运行正常。但是,请注意,您还依赖于用于捕获和显示 DDS 文件的任何软件的行为。对 DirectXTex 的一个更好的测试是简单地在库中进行往返转换 float->int->float 并以数字方式而不是直观地比较结果。

关于graphics - DXGI_FORMAT 的确切颜色空间是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13491131/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com