你了解OpenEXR吗?



原文地址:http://www.x-graf.com/2012/07/more-about-exr/

很多人对 OpenEXR 这种图像格式的了解仅限于:它是 32bit 的,它可以支持多通道,VFX 公司都在使用 EXR。这些都没错,但如果你的渲染器生成的是 tile 方式的多通道 EXR,则会降低 Nuke 的合成的效率。

Tile vs. Scanline

    很多人都不知道在输出 EXR 文件的时候有两种方式:tile 和 scanline,而 Nuke 读取图像是以 scanline 方式从上至下读取,如果读取 tile EXR,速度会非常慢(单通道文件没有感觉,多通道文件感觉明显),转换成 scanline 以后,速度可以提升 5-10 倍。

    渲染器大都以 tile 方式输出 EXR(Arnold 和 Vray 缺省为 tile;Softimage 的 mental ray 和 3delight 在界面内无法选择,只能用 tile;Maya 2013 开始将缺省的 EXR 和 TIFF 输出方式改成 scanline),渲染通常是分成图块来处理的,tile 方式允许渲染器将当前处理的图块存盘,这样可以节省 framebuffer 资源,而 scanline 方式则要等整个图像处理完毕后才能存盘,如果渲染图片尺寸大的话,就会有明显的效率差别。

    正因为大部分渲染器输出的是 tile EXR,所以很多 VFX 公司都有专门的工具来转换生成的 EXR 文件。我也更倾向于渲染的时候不要直接输出多通道(multi-channel)EXR,而是每个通道单独输出,然后在 Nuke 里将这些通道序列结合成多通道的 EXR(可以使用 gizmo)。

压缩方式

    OpenEXR 支持无损和有损的图像压缩:32bit 文件会占用大量的磁盘空间,压缩能大大减少文件尺寸,减轻网络负荷。Zip 压缩的 scanline EXR 是 Nuke 推荐的。

Half float vs. Float

    合理选择输出半浮点还是全浮点的 EXR,很多通道(高光、反射、阴影等)使用半浮点即可,精度要求高的通道(depth、motion vector、incidence 等)可以使用全浮点。

单通道 vs. 多通道

    一堆单通道 EXR 文件和单个多通道的 EXR 文件,很难说是谁的合成效率高,这和个人习惯有关。

    把所有通道放到一个文件中,会导致文件尺寸变大,增加网络负担。我常用的合成通道有:diffuse, indirect diffuse, specular, indirect specular (reflection), shadow, depth, normal, fresnel, point position, RGB matte, occlusion, (reflect occlusion), (refraction), (RGB light)。有些材质会使用更多的合成通道,例如 SSS。如果可能,我还会渲染 beauty 通道,以供快速预合(这样就不需要等待所有 pass 合成一遍才能看到大致结果)。这里只是一些参考,并不一定适合所有的情况。渲染合成之前先测试一帧,看看有没有明显的速度问题,有的话就要找找问题的根源了。

你可能感兴趣的:(图形,OpenGL,C++C)