HDR如何运作?


17

我试图了解什么是HDR及其工作方式。

我了解基本概念,并对如何使用D3D / hlsl进行实现有一点了解。

但是,它仍然很雾。

假设我要渲染一个具有地球纹理和一小部分顶点的球体,以充当恒星,那么如何在HDR中渲染呢?

这是我有些困惑的事情:

  • 我猜想,我不能为纹理使用任何基本的图像格式,因为在着色器中,值将限制为[0,255]并限制为[0,1]。后缓冲区同样如此,我认为格式需要为浮点格式?

  • 还涉及哪些其他步骤?当然,不仅仅需要使用浮点格式来渲染到渲染目标,然后在后期处理中应用一些光晕?(考虑到输出将始终为8bpp)

基本上,HDR的步骤是什么?它是如何工作的 ?我似乎无法找到任何好论文/文章描述的过程中,除了这一个,但它似乎有点掠过基础,所以它的混乱。

Answers:


19

与传统的照明/纹理相比,HDR技术使您可以模拟比在屏幕上查看更大的细节范围。您可以将其与眼睛在不同量的光线下的行为进行比较-当光线过多时,眼睛会让较少的光线进入,因此物体仍在可见范围内。当光线不足时,光圈会打开更多,因此可以看到更多细节。

bit-tech.net HDR比较

该图像的右侧使用HDR。它更多地利用了颜色范围,暗处更暗,明亮区域更亮。相比之下,图片的左侧看起来有点平。

基本步骤是:

  1. 使用模型上的其他浮点纹理和/或亮度可能大于1.0f的灯光,将场景渲染为浮点纹理(格式为A16B16G16R16F)。

  2. 要显示此纹理,需要将可见颜色范围转换为可在屏幕上显示的内容-此过程称为 色调映射,可以使用各种不同的色调映射方程式获得不同的效果。这是必须的,因为监视器无法显示我们可以存储在浮点纹理中的所有颜色或发光度(如果可能的话,这会很酷,但也有致盲的危险...)。

  3. 添加了Bloom和其他后效应,以进一步夸大渲染对象的发光差异。从浮点缓冲区计算光晕,并将其与色调映射的图像合并。

希望能有所帮助


我知道这是一个(非常)古老的问题,但是您能不能给我介绍一个很好而又简单的色调映射算法?
JSQuareD

6

从技术上讲,HDR仅意味着为图形使用更大范围的可能值。通常,红色,绿色和蓝色通道只能使用256个离散值,这意味着如果您有2个项目,一个项目的亮度是另一个项目的两倍,而第三个项目的亮度是第一个项目的10,000倍,则没有这样,您就可以正确地表示同一场景中的所有3个对象-您可以使明亮的对象仅比第一个明亮256倍,或者使两个钝的对象都完全黑(失去它们之间的对比度),然后明亮的对象会无限亮比他们俩都好。

通过将浮点值用于红色/绿色/蓝色值,可以轻松解决此问题-但是现在您遇到了一个问题,即如何在仅处理每个通道固定数量的离散值的图形设备上显示该值(例如256) 。因此,问题的第二部分是如何将浮点值映射回有限范围。最简单的解决方案是将所有值按比例缩放到离散范围内,但这将意味着1个非常明亮的像素会使屏幕的其余部分变黑,等等。有时这是您想要的,有时却不是-请参阅CiscoIPPhone的色调映射链接,以获取有关如何实现此目标的示例。

通常,不需要以新格式存储纹理-而是在将照明应用于它们时,您需要能够容纳更大的值。但是很明显,如果您将光源烘焙成纹理-例如。繁星点点的背景-您可能希望在那里使用更高分辨率的格式。或者只是在需要渲染时使着色器按比例放大这些材质的值。


5

传统上,计算机将屏幕上的每个像素表示为内存中的24位:红色代表8位,绿色代表8位,蓝色代表8位。如果您添加了更多的内容,这几乎是一个人类不会注意到的位,而8位字节对于微处理器来说非常方便,因此就是这样。

而8位是几乎足够的精度,以显示图像,这绝不是足够的精度来计算的图像。在计算图像的各个点上,至少需要32位精度。

这就是为什么即使在渲染到8位精度的图像时,像素着色器也可以以32位精度计算颜色的原因。否则,您不能例如将一个值除以1000,然后再将其乘以1000,因为将任何 8位值除以1000都会得出零。

实时3D图形已趋向于将所有图形的精度保持在> 8位,直到最后可能的时刻为止,此时,> 8位的红色被下采样为8位,对于绿色和蓝色,依此类推。

HDR是指渲染到高于8位精度的图像的行为。在当代电视视频游戏中,16位精度已成为常态,这在未来几年的视频游戏中可能已经足够了。


2

我认为,HDR的关键之一是显示器伽马​​的正确应用。

您正在查看的监视器根据输入像素产生的光线。您可能希望值​​255的像素产生的光(比值1的像素大)大约255倍。情况并非如此。在标准显示器伽玛值为2.3的情况下,它的亮度是255 ^ 2.3倍,约340000!

每个制作内容的人(相机制造商)都知道这一点,或者(如果您是设计师)则暗中对其进行补偿。

如果只渲染位图(很好,大部分时间),这很好,但是如果将它们用作3D场景中的纹理,则情况就不同了。如果要正确建模与灯光的交互,则应在整个渲染管线中使用线性灯光计算。这表示

  • 校正伽玛的纹理

  • 使用线性光源渲染所有物体(由于光线的动态范围高,因此需要很高的精度),

  • 在将图像放到屏幕上之前,最后应用显示器的逆伽玛变换。

当您使用现有的艺术品,灯光等对现有场景进行更改时,您可能必须修复许多灯光强度和纹理,因为它们被选择为在使用非线性光源进行渲染时看起来不错。因此,这不是您可以“打开”并期望一切看起来都更好的功能。


2
Gamma绝对重要,并且是正确实现基于物理的渲染的关键,但与HDR,IMO没有直接关系。
内森·里德
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.