我注意到,在非常柔和的渐变中,24位色深是不够的,因为您可以看到颜色的过渡。在黑暗的场景或夜空中弹出最多。
为什么没有人将颜色深度更改为每个通道两个字节?我知道这将需要大量工作,并且必须更换许多硬件,但是我觉得这很烦人。我真的不认为硬件技术还不够成熟。
那么为什么没人这样做呢?
这是“ The War Z”的图片,您可以了解我的意思:
我注意到,在非常柔和的渐变中,24位色深是不够的,因为您可以看到颜色的过渡。在黑暗的场景或夜空中弹出最多。
为什么没有人将颜色深度更改为每个通道两个字节?我知道这将需要大量工作,并且必须更换许多硬件,但是我觉得这很烦人。我真的不认为硬件技术还不够成熟。
那么为什么没人这样做呢?
这是“ The War Z”的图片,您可以了解我的意思:
Answers:
您或多或少自己说过:“我知道,这将需要大量工作,并且必须更换许多硬件。” 虽然图形硬件的工作实际上是相对简单的(如果很昂贵-如果将所有纹理和帧缓冲区的大小加倍,这并非易事),但对于更高色深图像来说,“生态系统”根本就不存在。某种程度上,这代表了任何人都值得的支出,因为没有LCD制造商正在集中精力尝试使每个像素最多达到16位(尽管在10BPP上进行了一些实验,但仍可以将RGB信号适合32-位通道)。
简而言之,对于大多数人认为还没有太大收获的事情来说,这简直就是太多的工作。可能很“烦人”,但是烦人程度太小,以至于图像质量的其他改进已被优先考虑。
是的,您不是第一个注意到这一点的人。:)在当今高对比度的情况下,除非使用抖动,否则每个分量8位不足以形成没有可见条纹的平滑渐变。
显示器制造商将每个通道在显示器上使用8位以上的颜色称为“ 深色 ”。由于鸡和蛋的问题,它不是很普及。如果没有可以输出深色的视频卡以及支持渲染为深色的游戏引擎,深色显示器将毫无用处。同样,没有显示的支持深色的游戏引擎或视频卡也毫无意义。因此,对于硬件制造商和游戏开发商来说,增加对该技术的支持没有太多动机,因为从任何一端来看,都没有市场可以证明开发成本的合理性。
同样,由于受限的8位精度,还有其他方法可以解决带宽问题。如前所述,游戏引擎可以使用抖动来隐藏条纹。
(具有256色调色板且无抖动和抖动的猫的图片。由Wikipedia用户Wapcaplet创建,使用CC-By-SA 3.0许可使用。)
在将像素值写到帧缓冲区之前添加±0.5 / 255的轻微抖动,对于隐藏平滑渐变上的条带非常有效,并且基本上不会引起注意。如果您使用的是HDR引擎,则可以在色调映射阶段执行此操作。
最后,正如其他人指出的那样,与8位精度相比,纹理压缩可能是图像中带状伪像的更大来源。尽管很难说,这可能就是这张照片中天空的状况-它上面有太多的JPEG压缩,以至于由于DXT压缩而产生的任何伪像都被淹没了。
还值得注意的是,许多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高斯模糊对我来说更加平滑),但是很难确定。
史蒂文·斯塔德尼基(Steven Stadnicki)的答案是正确的-游戏很少使用精度更高的纹理,因为它需要太多的纹理内存,因此在像素着色器中对纹理进行采样时需要太多的内存带宽。但是,有些解决方案不需要大的纹理。(我会将其发布为评论,但时间太长。)
Homeworld通过将天空图像编码为顶点梯度来解决此问题。这种技术非常适合大型低频图像(即平滑的渐变)(例如天空),其中的纹理覆盖了游戏中的大量像素。
另一个可能的解决方案是对您的天空图像应用直方图归一化。如果纹理数据位于狭窄的值范围内(例如漆黑的夜空),则每个颜色通道中的大多数位都不会携带有用的数据。相反,请执行以下操作:
确保着色器代码伽玛正确。如果对未从sRGB颜色空间转换为线性空间的纹理样本进行数学运算(照明和后处理),您将看到类似所描述的条带伪像。伽玛校正的创建是为了通过将更多的位分配给您的眼睛对值变化更敏感的暗值来帮助缓解此类问题。但是,如果在计算时不考虑伽玛校正,例如照明,曝光或后处理FX,则很容易造成问题。该伽玛常见问题是很有帮助的。