作为(漫反射/反照率)纹理的16位半浮点线性HDR图像?


10

因此,我已经考虑了一段时间,并尝试通过google找到答案,但没有成功。

如果您所有的纹理都是8位LDR图像(如JPEG),则在渲染时不可能与曝光控制/色调映射产生冲突。就是说,如果您调整图像的渲染曝光度,则应该在纹理中不存在的细节上进行曝光,因为低动态范围限制了这些细节。因此,在具有16位半浮点数的线性色彩空间中将纹理作为HDR图像并另存为.exr,以获得良好的颜色表示(32位“全”浮点数可能会过大吗?),这是否有意义?我认为,要获得更详细和正确的颜色值,可能还会对GI产生影响,并且如何计算颜色渗色?

还是根本没有必要,因为我们想要的渲染的最终结果可能会与以任何方式拍摄的纹理的曝光水平相似?而且由于相机通常以12-14bit的速度拍摄,因此您必须对纹理进行多次曝光,并做所有额外的工作才能将它们全部组合成一个HDRI。

编辑: 为澄清起见,我最感兴趣的是从照片逼真的渲染角度来看,使用光线跟踪渲染器(例如mental ray,V-Ray,Arnold等)进行全光模拟和全局照明,而不是实时游戏引擎。

Answers:


8

在电影制作中,由于条纹等原因,我们几乎从不对颜色/反照率使用8位纹理。(JPEG尤其有问题,因为按规范,它是sRGB而不是线性值。)我们要么使用“ half”(16位浮点) )或颜色/反照率纹理的16位无符号整数值。


1
哇,谢谢@LarryGritz!考虑到您为Sony Pictures Imageworks工作,我将您视为非常可靠的消息来源!:)但是您如何捕获这些纹理?大多数相机仅以14位RAW文件拍摄,您是否有带有16位线性传感器的特殊相机?还是您对纹理进行多次曝光,就像对基于HDRI成像的照明一样?还是仅使用14位相机RAW捕获并将其保存为“ 16位”?哦,您要使用.tiff(.tx,.tex)或.exr什么文件格式?再次感谢您的输入!!:)
Kristoffer Helander

1
@KristofferHelander:通过乘法很容易实现从14位捕获到0-1范围的16位表示的转换。但是我们的大多数纹理都是绘制的,而不是照相的-有时它们直接以16位格式绘制,有时以sRGB绘制,然后在“线性化”时转换为16位以用作纹理。不需要HDR的反照率纹理。
拉里·格里兹

1
@KristofferHelander:对于反照率纹理,我们倾向于将TIFF与16位整数数据一起使用(我们将.tx称为TIFF格式,但将其平铺并且将MIP映射多分辨率存储为TIFF文件中的多个子图像)。对于真正的HDR数据,例如环境捕获,我们使用OpenEXR。渲染器输出也倾向于是OpenEXR。
拉里·格里茨

8

是的,在某些极端情况下,HDR照明和色调映射可能会暴露颜色纹理中的条纹问题。在那些情况下,对纹理使用更高的位深度可能会很有用。但是,以我的经验,大多数材质和普通照明情况都不会出现此问题,并且典型游戏中的大多数纹理在8位(甚至更少)上都可以,游戏通常使用BC1压缩,从而将其压缩为5 6-5位)。

人们之所以使用HDR渲染目标,是因为单个场景可以包含截然不同的亮度值,例如在黑暗的房间中,您可以透过窗户看到比房间明亮10到100倍的阳光照射的外部。但是,颜色纹理没有这么宽的幅度。它们代表反射率,固有地在[0,1]范围内,实际上,很少有日常材料的反射率低于2%到5%。因此,一个8位图像(使用伽马编码)通常可以足够精确地表示漫反射和镜面反射颜色。

确实,很暗的纹理与非常明亮的照明或曝光过度的相机设置的结合可能会在最后一帧中显示出条纹,但这是一种更不常见的情况。

在这里你可能是一个情况下希望有一个HDR纹理是发光材料,特别是对霓虹灯和类似的光源。纹理的值会增大,在游戏中会显示为明亮的光源,因此在这种情况下,一个8位图像很容易显示出条纹。

最后,如果可能的话,在捕获和创建纹理时以更高的精度(例如16位精度)工作仍然很有用,这仅仅是因为它为您提供了更多空间来处理图像而不会引起精度问题。例如,如果您需要调整色阶或色彩平衡,则可能会损失一些精度。从8位源图像开始时,这可能会导致带区(特别是如果您多次这样做)。16位源将更能应对此类问题。但是,游戏中使用的最终纹理可能仍会压缩为8位。


combination of a quite dark texture with very bright lighting or an extremely overexposed camera setting can show banding in the final frame很好的见识。但是我们可能会注意到,伽玛编码正是为了缓解这一点。如果他有问题,为什么不尝试使用更好的伽玛指数呢?但这会禁止使用硬件sRGB采样器。
v.oddou '16

谢谢您的意见。但是要澄清一下,我最感兴趣的是从照片逼真的渲染的角度来看,光线追踪渲染器(例如mental ray,V-Ray,Arnold等)具有全光模拟和全局照明,而不是真实的。时间游戏引擎。
克里斯托弗·海兰德

@KristofferHelander很高兴知道,但是我认为我写的内容可能同样适用于离线渲染。但我承认我在这方面没有太多直接经验。
内森·里德

@NathanReed是的,您肯定在那儿提出了一些非常好的观点:)
Kristoffer Helander

5

如果有时间,我想邀请读者阅读有关Quake 2引擎栅格化技术的详细文章。

如果是TLDR,请注意以下图片: 在此处输入图片说明

我们所看到的是Albedo通道,如果我正确理解您的问题,那就是您想要以16位编码的通道。
我不会说“ 如果过去可以将它编码为256种颜色的游戏,为什么在新游戏中我们需要281474976710656(即281万亿)? ”即使我愿意,但听起来像pixar脾气暴躁的家伙起来 更具有建设性的意义是,如果您在这张图片中指出,所有事物都处于相同的照明水平。更特别地,保持期望的饱和度的最大可能强度。(意味着在HSV空间中,V已最大化)

重点是关键,我们几乎不需要任何位,因为反照率始终没有深度来编码。动态来自阴影,f32在着色器中的每个组件中工作并输出以f16渲染目标是有意义的。但是,存储反照率纹理f16不仅过分,而且对于我们宝贵的带宽来说是严重的不合理性能消耗。


谢谢您的意见。但需要澄清的是,我最感兴趣的是从照片逼真的渲染角度来看,光线追踪渲染器(例如mental ray,V-Ray,Arnold等)具有全光模拟和全局照明,而不是真实的。时间游戏引擎。我已经更新了我的原始帖子。
克里斯托弗·海兰德
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.