百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

影视级角色灯光与渲染流程分解,含教案模型下载

liebian365 2025-03-30 18:14 20 浏览 0 评论

Johan Vikstrom是来自瑞典斯德哥尔摩的3D高级美术师,拥有16年的工作经验,曾作为compositor参与制作2011年的一部哈利波特电影。


作为一位全能艺术工作者,在过去的5-6年里,Johan Vikstrom一直专注于 lookdev / lighting / compositing,不断完善自我。



此次,我们找来了Johan Vikstrom的一篇流程教程《voight kampff workflow-流程分解》:使用扫描头部文件,制作逼真的头像


有模型文件!有模型文件!有模型文件!含:FBX、OBJ、ZTL等多种格式,以及16K贴图文件!


本期流程案列,Johan Vikstrom有提供了文件模型以及贴图文件


使用的工具:Maya、V-ray、Yeti、Mudbox和Nuke,本篇将介绍如何使用它们。其他软件也可以做类似的操作,只是操作有所不同。


此案列要求具有良好的基本3D照明/合成知识,以及一些渲染经验。流程思路只是起到一个抛砖引玉的效果,具体项目中还得根据实际情况调整,翻译校对有限,不准确的地方请海涵~



最终渲染




参考


人类皮肤的模拟极其复杂,因此需要大量的参考资料。事实上,大多数好莱坞作品都有替身来拍摄皮肤/灯光。所以,如果你要照亮一个真实感的人,我建议你选择一张真人的照片作为参考。这样,你就可以看到什么是正确的,什么是不正确的。


我使用了《银翼杀手1982》中的这张照片供我参考。





相机


我的第一步是确定使用什么相机。理想情况下,你需要了解用于匹配100%的相机的胶卷,焦距和F-stop。如果没有此类信息,也没关系。你可以通过将物体放在视框中,查看它们是否与图片中的物体对齐来尝试对相机进行调整。来回调整焦距,直到匹配为止。如果你在图片中也给了一些线条,跟踪软件可以为你计算一个预测。

对于镜头,我知道他们大多使用幕后电影中的100毫米以上的镜头。因此,我猜想该镜头为100毫米,可能是2.0-2.8 F档。F档越低,景深越大。

我最终在照片上使用了2.0 F-stop,这使你的对焦区域非常狭窄。事后看来,我认为该镜头使用的是2.8,但我弄错了相机/对焦点或姿势角度,所以在2.8时他的耳朵仍在聚焦,所以这就是为什么我需要使用2.0

要将真实感添加到cg相机中,你需要添加景深,还需要添加散景图。



这有助于为最终渲染带来真实感,为此,你需要附加VrayPhysicalCamera并添加光圈贴图。它们通常看起来像这样:



对于我的镜头,使用的相机是变形的,但是我实际上使用了正常的圆形光圈图,然后在VrayPhysicalCamera设置中将“bokeh anisotropy”设置为-0.353。这也将为你提供变形的孔径图。我也取消选中“Affects exposure”,因此你不必根据相机设置补偿光强度。


姿势角度


开始场景时,重要的是要考虑比例。大多数高端生产渲染器使用真实世界的单位进行着色器/光照计算。因此,我们场景中的所有事物都需要使用正确的大小,或者尽可能地使用最接近的大小。1个Maya单位应为1厘米。

我试图使扫描模型尽可能地接近参考。你应该意识到,角色与参考之间的微小角度差异会导致网格移动到皮肤表面的其他位置。同样,如果你的3D模型与参考图片中的actor不匹配,那也会导致这种效果。因此,尽可能准确地摆姿势角度将使你以后的照明过程更加顺畅。




资产着色


3D扫描商店提供了非常干净的扫描和良好的漫反射纹理,因此该部件运行非常平稳。我使用linux,所以我不得不将模型带到mudbox才能输出位移图,因为资产没有提供它。对于漫反射纹理,我只从纹理中去除了眉毛,以便后续添加cg头发。

删除纹理贴图上的所有SSS效果,因为这可能会导致渲染中的红色区域发亮。VrayAlSurface非常适合计算准确的SSS。如果要绘制自己的纹理,也不需要将SSS效果绘制到纹理中。一个简单的带遮罩的红色渐变节点可以解决此问题。



在skinshader 中,我只使用了一点normal map来为网格带来更多细节。



对于 specular color的颜色,我使用了具有一定等级的cavity map,以获取规格图的某些变化。


我使用了glossiness maps,但实际上在我的 spec setup.中它们所做的工作很少。它们可能一起被移除。spec shader 由两个blinn specular shaders组成,glossiness的sharper shader 为1, diffuse spec shader 约为0.6-0.7。相反,镜面顶层的粗糙度由微位移控制,这可以使镜面更精确地散射在皮肤上。


(这段翻译总有点奇怪,原文在这里:The roughness of the top layer of specular is instead controlled by the microdisplacement, this gives more accurate scattering of the specular on the skin. )



为了控制specular的粗糙度,我对microdisplacement 进行了分级以获得我想要的结果,类似于对glossiness /roughness map.进行分级的方式。


我将microdisplacement 添加到normal displacement map的顶部。layeredTexture控制着整体的specular,为此图像我使用了0.04的加法。如果我使用0.02,他看起来会比参考文献更出汗。但我不想他看起来也满头大汗。


下面是没有microdisplacement 的渲染图,因此你可以了解microdisplacement 在分散规格方面所做的工作。




整理资产


为了修饰,我使用了Peregrine Labs Yeti。对于睫毛,我使用了另一项资产中的curve setup。因此,我只是对曲线进行了调整并将其拟合到该模型中,然后让其沿着曲线生长毛发。

桃色绒毛有助于分解 specular产生更多真实感,当以5k分辨率进行渲染时,它们实际上会进行一些非常准确的修饰,因此最后我做了一些重新渲染,发现桃色绒毛错了方向。



眉毛有点特殊。我知道制作眉毛很糟糕,所以我想出了制作眉毛的新思路。我知道我具有真实的眉毛纹理,所以我的想法是,如果可以在真实的眉毛上绘制曲线,我将获得非常准确的眉毛引导曲线。因此,我只裁剪了带有眉毛的多边形的一部分网格。



然后,我将所有垂直边缘转换为曲线,并在其中放出一个曲面曲面。



maya具有此功能,可以在曲面上绘制曲线,但是该曲面必须是小块。因此,在制作了nurbs表面之后,我在其上放置了一个透明着色器,以便可以看到后面带有纹理的多边形网格。而且我将多边形网格锁定在显示层中,因此无法选择它。现在,我可以使用“Pencil Curve Tool”查看纹理时在nurbs曲面上绘制曲线。



之后,需要将曲线从表面曲线转换为法线。然后,重建它们以减少曲线上的点。在那之后,很容易就可以从非常精确的引导曲线上画出眉毛。我确保在眉毛的边缘上保留了所有精确的曲线,但并没有使每根头发都位于较厚的区域。我每个眉毛使用了大约200条曲线。



对于眉毛较厚的部分,我使用了density map来生成更多的头发。您还需要注意绘制曲线的方向,您需要从发束的底部开始,否则将改变头发的方向



由于曲线正好在曲面上,希望它们略微突出,可以将引导节点设置为小于100%来在Yeti图形中进行控制。还要记住将位移添加到网络中,这样就不会在网格后面留下毛发。这也适用于桃子毛。对于头发来说,它通常不那么重要。

对于胡须,我刚刚绘制了density map,并添加了一个groom来控制头发的方向。



对于hair shaders ,我使用了VrayHairNext,这是一个非常好的头发着色器。我没有使用任何贴图,只是玩了“Melanin”设置,并调整了随机设置,直到在vrayRT中获得所需的设置为止。



灯光照明


对于照明,需要重新考虑比例。场景中的灯光放置在哪里,距离角色有多远?它们在哪里与相机有关?这将影响到图像的真实感。



在实际工作中,可以使用原始素材板,当使用渐变板时,可能会有些棘手。需要注意,平地机可以使用按键和遮罩来控制图片不同区域的照明。


因此,也许并非在图片中看到的所有光线实际上都与原始素材中的光线相同。


我首先选择了HDR,然后对HDR进行分级以匹配参考。需要从HDR中移除所有光源。这样做是为了可以完全控制渲染中的所有灯光。因此,请在任何照片编辑软件中将其删除,然后保存一个仅包含设置而没有灯光的版本。


在实际的制作中,可能需要裁剪出HDR中的每盏灯,并将它们作为图像添加到照明场景中的灯中。这样,将从照明中获得最真实的结果。但是由于我现在要制作完全不同的照明,所以我不需要使用此HDR中的任何照明。



3D场景中的所有灯光都需要对其应用HDR灯光图像,这为灯光的反射和照明行为增加了很多真实感。HDR的裁剪方式也会影响光的行为。

可以在光源的边界处进行裁切,也可以在光源之外进行裁切以捕捉光源的耀斑效果。还需要使用方向属性,以使灯光在场景中正确起作用。是侧边有襟翼的聚焦灯还是柔和的灯?


例如,这种张开效果在眼反射中看起来非常好,并增加了很多真实感。另一种方法是关闭灯的反射,并添加带有喇叭口的反射卡。也可以使用坡道遮挡灯光的一部分。



根据环境,可以选择对其建模或仅使用HDR domelight。选择哪种,取决于环境对被摄对象的照明强度。


我选择不为该项目的环境建模,主要是因为我知道环境在该场景中将投射很少的光/反射。但是将HDR映射到环境模型是一件好事,因此渲染器知道到对象的距离。


这样,将在表面上获得正确的反射。domelighting具有极小的距离,因此渲染器如何知道HDR中的白色墙距离角色是100米还是10厘米?即使是带有平面和长方体的非常简单的模型也会对最终渲染质量产生很大影响。



我在他身后用一架黑色飞机挡住了HDR中来自他身后的光线。关于遮光,你可以尝试了解真实照明,再来处理灯光和遮挡。在场景中使用黑色的窗帘或黑色的物体来挡光。


只需考虑将阻止器放置在什么位置,使它们在相机中不可见,这对于照明也同样适用。


除非在图像中,否则在相机中不应看到灯光。当然,灯光可以在渲染中,然后在实际制作中后期删除。但是请注意,这可能导致不切实际的效果。

因此,让我们分析一下这张照片的照明。要寻找的是光线照射到皮肤表面的位置,阴影如何掉落以及皮肤上的高光在哪里。



眼睛也非常好看,您可以看到反射在眼睛上的是哪种光。



主要照明来自窗户。如果研究电影中的镜头,你会感觉到它们所处的距离和高度。


照明时,最好实时查看一次实时渲染中的一个光源。Vray为此提供了vrayRT,因此我可以移动灯光并实时查看只有灯光照射到表面的方式。


如果查看补光灯,皮肤和眼睛会有非常强烈的反射,但同时此部分脸也处于阴影中。他们可能为此使用了非常强烈但很小的光线。但是我选择删除它,因为我不希望他看起来像满头大汗,所以我选择了更大的柔和光线。


我实际上误会了反射光,并认为这是他下面的光源。我想了很长时间才找到一个亮点,所以我会在他的鼻子和下巴下得到与图片相同的反射。最后,我意识到这实际上是他的白衬衫在皮肤上反射出来。


由于我的角色没有白衬衫,因此无法获得这种效果。我保持了光线,但使用了非常低的强度,因此在渲染中几乎看不到它。由于我从补光灯中去除了强烈的反射,因此我在场景中添加了一些顶光,以对他脸部较暗的部分进行一些反射,因此该区域看起来并不那么平坦。



你应该尝试尽可能模仿渲染与参考的光对比度。这将减少你的后期工作。


合成


该过程的这一部分可能是最重要的部分。在这里,可以修复很多错误,也可以进行较大的更改,然后将其重新传输到资产中,以使工作流程更流畅。

渲染时,请确保使用AOV,以便可以分别调整reflections/specular/sss/etc separetely。


我将渲染图与参考并排放置。现在,我可以看到渲染得到的接近程度以及为获得相同等级需要进行哪些更改。


首先,我对整体对比度进行评定。使用Nuke时,我使用“ colorLookup”节点,该节点提供曲线以控制整个和每个RGB通道。


一个小技巧:将图像转换为带有“log2lin”节点的grade节点之前的log colorspace。这样可以更好地控制颜色曲线。然后将其转换回linear colorspace ,之后将“ log2lin”节点反转。


总体成绩良好后,我将分别分析每个颜色通道。



通过分别查看每个通道,我可以调整每个通道的颜色曲线,直到获得尽可能接近的匹配为止。首先,我主要是看皮肤的对比度和光值。

对于电影胶片,通常会进行一些软剪切,使高光降低,同时仍保持与图片其他部分相同的强度。在nuke中,你可以执行“ softClip”节点。你也可以使用曲线手动进行。

在分级过程中,你会注意到照明是否需要调整。颜色或强度可能需要调整。如果你对分级进行的更改过于剧烈,可能需要先在照明上进行一些平衡工作。


分级之后,得到与我们的参考非常相似的图像。



我还添加了一些颗粒和镜头失真,我只是向红色通道添加了一些随机的低值,然后为绿色添加了更多,对蓝色通道添加了更多。足够低,因此它不会在最终图像中弹出。


最后,我添加了一点点细腻感,这种效果实际上发生在相机中。在某些方面比其他方面更多。但是通常需要在变暗的胶片边缘周围使用遮罩。


我决定最终裁剪图像,以使其更好地进行查看。所以现在它更像是人像而不是胶卷画面。


这是图像的最终版本。




相关推荐

[西门子PLC] S7-1200PLC中所支持的数据类型详解

数据类型呢,就是讲数据的长度和属性的,也就是指定数据元素的大小,还有怎么去解释数据。每个指令起码得支持一种数据类型,有的指令还能支持好多种数据类型。所以呀,指令上用的操作数的数据类型一定得跟指令支持的...

C语言wctomb函数详解:宽字符到多字节字符的「翻译官」

核心定位wctomb是C语言中用于将宽字符转换为多字节字符的「翻译官」,它能将单个宽字符(wchar_t)转换为多字节字符(如UTF-8编码的中文)。就像一位翻译官,它能将一种语言(宽字符)翻译成...

Python 中数组和列表之间的区别(python列表和c语言数组区别)

在这篇文章中,您将了解Python中数组和列表之间的区别。Python列表Python列表是一种内置数据结构,是包含在方括号[]的元素集合。它们具有许多独特的属性,使它们与其他数据结构不同。有...

Linux内核设计与实现—进程管理(linux内核原理与实现)

进程进程就是处于执行期的程序(目标码存放在某种存储介质上)。进并不仅仅局限于一段可执行程序代码(Unix称其为代码段,textsection)。通常进程还要包含其他资源,像打开的文件,挂起的信号,...

实际工程项目中西门子S7-1500如何批量读取和写入机器人信号

方法一:DPRD_DAT:读取DP标准从站的一致性数据该指令适用于中央模块以及DP标准从站和PROFINETIO设备。可以使用以下数据类型:BOOL,BYTE,CHAR,WCHAR,WO...

C语言mbstowcs函数详解:多字节字符串到宽字符的「翻译官」

核心定位mbstowcs是C语言中用于将多字节字符串转换为宽字符字符串的「翻译官」,它能将多字节字符(如UTF-8编码的中文)转换为宽字符(wchar_t)。就像一位翻译官,它能将一种语言(多字节...

C语言mbtowc函数详解:多字节字符到宽字符的「翻译官」

核心定位mbtowc是C语言中用于将多字节字符转换为宽字符的「翻译官」,它能将单个多字节字符(如UTF-8编码的中文)转换为宽字符(wchar_t)。就像一位翻译官,它能将一种语言(多字节字符)翻...

西门子PLC系列连载|No.5 初识西门子1200PLC数据类型

导语:在之前的文章中我们介绍了PLC的相关基础知识和一些小的程序段,也讲解过博途软件使用的一些基本方法。那么我们在本章内容将为大家讲解关于西门子1200系列PLC的常用数据类型,以及这些数据类型的区别...

计算机中常见的字符编码及存储方式

常见的字符编码ASCII、GBK、GB2312、Unicode等等常识用多个字节来代表的字符称之为宽字符,而Unicode码只是宽字符编码的一种实现,宽字符并不一定是Unicodechar窄字...

西门子SCL高级语言之数据转换介绍

(整数转浮点数INT_TO_REAL)我们在做项目中经常用到各种类型的数据,这就需要转换(CONVERT)指令来转换,由于博途数据转换指令只有它一个,那我们就只记住它就可以了,注意设置需要转换...

SCL编程语言学习(2)-启保停电路(起保停电路plc程序)

“启保停”电路是学习过程中最常见的一个案例,也是最简单易懂的控制程序。如果采用梯形图编程,如图1所示。在实际工程的电路中,很少有这么简单的起保停电路,一般都需要考虑急停、限位、过载保护等多项因素,启停...

GCC的常用编译选项(gcc编译工具)

GCC(GNUCompilerCollection,GNU编译器套件)是由GNU开发的编程语言译器。对于C语言源代码文件,使用GCC生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相...

「C语言」初始化数组,C语言中初始化特定列表和元素

如果没有显式地初始化数组变量,那么就会采用一般规则:如果数组具有动态存储周期,那么数组元素的值就是没有定义的。否则,所有的元素都会被默认地初始化为0(如果数组元素是指针,则会被初始化为NULL)。编...

C++11新特性(c++11新特性 lambda)

1、智能指针2、Lambda表达式3、线程库4、原子操作5、统一的列表初始化{}6、右值引用和移动构造7、引入nullptr指针8、类型推导auto和decltype智能指针:智能指针是一个...

西门子 S7-1200 PLC 数据类型详解

关注“PLC发烧友”,一起涨知识!回复:西门子全套,领西门子系列PLC电子资料包!数据类型用来描述数据的长度和属性,即用于指定数据元素的大小及如何解释数据,每个指令至少支持一个数据类型,而部分指令支持...

取消回复欢迎 发表评论: