24位色深不够?


30

我注意到,在非常柔和的渐变中,24位色深是不够的,因为您可以看到颜色的过渡。在黑暗的场景或夜空中弹出最多。

为什么没有人将颜色深度更改为每个通道两个字节?我知道这将需要大量工作,并且必须更换许多硬件,但是我觉得这很烦人。我真的不认为硬件技术还不够成熟。

那么为什么没人这样做呢?

这是“ The War Z”的图片,您可以了解我的意思:

War Z颜色过渡


12
您的图像为JPEG格式,也可能产生伪像。您能以无损格式呈现示例吗?
Orionii皇帝'13

你在跟我开玩笑吗?您抱怨位深,但是上载JPEG文件?
塔拉

1
究竟。当JPG极大地证明了我的意思时,就不需要无损格式了。顺便说一句:造成这种效果的不是压缩。节省您的资源吧……
Liess Jemai 2015年

Answers:


19

您或多或少自己说过:“我知道,这将需要大量工作,并且必须更换许多硬件。” 虽然图形硬件的工作实际上是相对简单的(如果很昂贵-如果将所有纹理和帧缓冲区的大小加倍,这并非易事),但对于更高色深图像来说,“生态系统”根本就不存在。某种程度上,这代表了任何人都值得的支出,因为没有LCD制造商正在集中精力尝试使每个像素最多达到16位(尽管在10BPP上进行了一些实验,但仍可以将RGB信号适合32-位通道)。

简而言之,对于大多数人认为还没有太大收获的事情来说,这简直就是太多的工作。可能很“烦人”,但是烦人程度太小,以至于图像质量的其他改进已被优先考虑。


1
尽管最终用户无法直接访问,但某些针对图像/视频专业人员的高端27/30“监视器内部是14位,外部是14位,并使用额外的4位来存储查找表,以帮助校准显示器上的颜色。
2013年

@DanNeely:任何“最终用户”都可以花上几千美元。他们还需要一个专业级的图形卡,例如Quadro。考虑到某些人为他们的电视和音响系统付费,这还不错。
Zan Lynx

@ZanLynx我使用了针对专业人士的短语,而不是仅针对专业人士。任何人都可以购买全部筹码;但是价格如此之高,而收益却如此之少,以至于很少有人这样做。例如,只有1.17%的Steam用户拥有2560台显示器。显示器是必需堆栈中仅有的一部分,超级用户最终可能会偶然获得该堆栈,因为来自主流供应商的2011型号年度品牌2560显示器中的某些(全部?)显示器包括10 / 14bit彩色;后来一段时间以来,廉价的韩国进口产品才被广泛使用。Quadro / etc卡对游戏玩家和标准玩家没有任何帮助。
Dan Neely 2013年

1
这样的合并实际上是否可能是文本优化,以减少渲染天空的工作量?当我在GIMP中创建24位渐变时,它看起来不是那样。有关24位渐变,请参见static.inky.ws/image/4306/gradient.png
ldrumm

2
@ldrumm不,不是,您确实利用了最大范围,并启用了gimp抖动功能,请看一下带有抖动(可见轻微条纹)的示例,这里没有抖动。问题是,您不能仅对纹理进行通用后处理抖动,并且大多数纹理不是通过使用渐变来创建的,如果它们是手绘的并且具有某种形式的大面积且渐变介于2种相当相似的颜色之间然后会有
乐队

44

是的,您不是第一个注意到这一点的人。:)在当今高对比度的情况下,除非使用抖动,否则每个分量8位不足以形成没有可见条纹的平滑渐变。

显示器制造商将每个通道在显示器上使用8位以上的颜色称为“ 深色 ”。由于鸡和蛋的问题,它不是很普及。如果没有可以输出深色的视频卡以及支持渲染为深色的游戏引擎,深色显示器将毫无用处。同样,没有显示的支持深色的游戏引擎或视频卡也毫无意义。因此,对于硬件制造商和游戏开发商来说,增加对该技术的支持没有太多动机,因为从任何一端来看,都没有市场可以证明开发成本的合理性。


同样,由于受限的8位精度,还有其他方法可以解决带宽问题。如前所述,游戏引擎可以使用抖动来隐藏条纹。


(具有256色调色板且无抖动和抖动的猫的图片。由Wikipedia用户Wapcaplet创建,使用CC-By-SA 3.0许可使用。)

在将像素值写到帧缓冲区之前添加±0.5 / 255的轻微抖动,对于隐藏平滑渐变上的条带非常有效,并且基本上不会引起注意。如果您使用的是HDR引擎,则可以在色调映射阶段执行此操作。


最后,正如其他人指出的那样,与8位精度相比,纹理压缩可能是图像中带状伪像的更大来源。尽管很难说,这可能就是这张照片中天空的状况-它上面有太多的JPEG压缩,以至于由于DXT压缩而产生的任何伪像都被淹没了。


+1-一个很好的答案,我完全没想到绑带还有其他原因的可能性。
史蒂文·斯塔德尼基

1
+1表示文件是jpeg。OP的无损示例可以防止由于数据中的噪声而导致判断不佳。
ldrumm

@ldrumm还是一个不可怕的游戏/引擎...
Brian Ortiz

我添加了图片以强调抖动可能带来的差异。如果您不喜欢它,可以随时恢复:)
BlueRaja-Danny Pflughoeft13年

13

还值得注意的是,许多LCD面板的每个通道甚至都没有8位。便宜些的倾向于使用较少的位并使用各种技巧来隐藏它。例如,它们可能会在两种相邻颜色之间快速切换以表示介于两者之间的一种。http://www.anandtech.com/show/1557/3

有关DXGI如何支持每个通道10位并且比白色更亮的详细信息,请访问http://msdn.microsoft.com/zh-cn/library/windows/desktop/jj635732%28v=vs.85%29.aspx

多年来,D3D还支持每个通道超过8位。如果开发人员认为这是一个好主意,那么没有什么可以阻止开发人员将每个通道的16位抖动降低到8位。

当然,如果源数据(纹理等)仅是8位(或更可能是DXT1,实际上是每通道5-6-5位),那将无济于事。我相信这就是截图中的天空(8-bpp高斯模糊对我来说更加平滑),但是很难确定。


10

史蒂文·斯塔德尼基(Steven Stadnicki)的答案是正确的-游戏很少使用精度更高的纹理,因为它需要太多的纹理内存,因此在像素着色器中对纹理进行采样时需要太多的内存带宽。但是,有些解决方案不需要大的纹理。(我会将其发布为评论,但时间太长。)

Homeworld通过将天空图像编码为顶点梯度来解决此问题。这种技术非常适合大型低频图像(即平滑的渐变)(例如天空),其中的纹理覆盖了游戏中的大量像素。

另一个可能的解决方案是对您的天空图像应用直方图归一化。如果纹理数据位于狭窄的值范围内(例如漆黑的夜空),则每个颜色通道中的大多数位都不会携带有用的数据。相反,请执行以下操作:

  • 以16位格式(例如16位TIFF)创作原始纹理。
  • 在为游戏引擎准备纹理时,请找到图像中存在的最暗像素,并以偏移量进行跟踪。假设此像素值在0-1的可能范围内为0.1。
  • 接下来,找到最亮的像素,然后减去最暗的像素,以获取图像中值的范围。因此,如果最亮的像素仍然很暗(例如0.35),则范围仅为0.35-0.1 = 0.25。图像中仅存在25%的值范围。
  • 生成DXT / BC压缩的游戏纹理。从每个像素中减去最暗的值,然后相乘以使用整个颜色范围。在示例计算中,我们减去了0.1的暗值,并且由于仅存在25%的可用值范围,因此我们将每个像素值乘以4x来创建游戏中的纹理。在将16位源图像量化为DXT压缩器的8bpp输入之前,请确保执行所有这些操作。现在,输出图像将利用游戏内格式支持的整个值范围。我们正在分配所有位来表示图像中实际存在的值。
  • 将暗值偏移量(0.1)和范围(0.25)存储在元数据中的某个位置。将这些作为输入传递到像素着色器。
  • 在像素着色器代码中,对移位后的扩展纹理进行采样,将其转换为浮点值,然后执行乘/加操作以恢复原始颜色值。换句话说,乘以0.25并加0.1即可恢复存储在源图像中的值。

确保着色器代码伽玛正确。如果对未从sRGB颜色空间转换为线性空间的纹理样本进行数学运算(照明和后处理),您将看到类似所描述的条带伪像。伽玛校正的创建是为了通过将更多的位分配给您的眼睛对值变化更敏感的暗值来帮助缓解此类问题。但是,如果在计算时不考虑伽玛校正,例如照明,曝光或后处理FX,则很容易造成问题。该伽玛常见问题是很有帮助的。


1

24位还不够,但是这种问题通常是由图像压缩算法,混叠或其他数字伪像引起的。另外,请不要忽略显示技术的作用-无论使用什么数字输入,显示器都可能无法在实际亮度上产生适当的阶跃。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.