打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
[转载]线性工作流程实施方案与心得分享All About Linear Workf
userphoto

2018.04.25

关注

作者:CG风火连城

 

前言:

这段时间研究Maya的线性工作流程与VUE的线性工作流程(linearworkflow,LWF),也一并测试了结合Nuke使用的方法及优缺点,有所总结,想与大家分享讨论,于是有了以下的文字。

本文列出了若干篇网络上其他搞CG的同仁写的有关linearworkflow的文章的链接,如果每一位读者都看完这些链接里的文章估计会有点儿累,那么亲爱的读者如果你信得过我,就可以直接阅读我所写的文字,如果你对某些细节有疑问再去看本文里的那些链接。

---------------------------------

 简要目录:

1、笔者对线性工作流程的一些观点

2、Maya的与Nuke结合的线性工作流程

2.1 经典实施方案(包含Nuke后期部分的处理)

2.2 基于“经典实施方案”的简化改良版

2.3基于Maya2011及以上版本的“色彩管理”方案

2.4 总结(哪个更适合我的项目)

2.5 附录(提升效率的小脚本等等)

---------------------------------

本人对于线性工作流程的一些观点:

观点之一:无论是Max、Maya、C4D、Houdini还是VUE等,理论上任何三维软件实施linearworkflow的原理都是一样的。

观点之二:linearworkflow最最最最灵魂的东西是什么?为什么要用linearworkflow?答案就是为了让灯光设置环节更加物理,灯光效果更加接近真实,灯光亮度过渡平滑,不容易爆,灯光能够使用二次方衰减。

观点之三:linearworkflow的要求是尽可能地保持数据的原始状态,不要经过任何的色彩空间或者是gamma的转换过程,否则就算不上是“线性”了。

观点之四:Nuke的“rawdata”读取方式能够确保8位图与16位图的renderpasses的合成不会出现问题,如果不用“rawdata”读取的话,renderpasses的分通道合成你可以自己试试...是合不回三维渲染的原始效果的,因为数据是非线性的(当然你改下Nuke读取8位图与16位图的默认LUT也行...这玩意儿说多了更容易混乱,不如不说)。32位图不存在问题。

观点之五:“线性工作流程”是个工作流程,讲究的是批量可操作性,因此如果不好操作的话就不方便应用于流程,因此以下的文字,都是在试图尽可能简化操作,例如统一8bit、16bitinteger(16位整型)、16bit halffloat(16位半精度浮点)、32bitfloat(32位浮点)图片的处理方式,不是不能分图片位深来分别处理,而是分别处理容易导致犯错。

 

一、Maya的与Nuke结合的线性工作流程

在开始之前请明确一点:mayasoftware渲染器不能很好的支持32bit浮点图像,并且我个人不推荐使用software渲染器去实施线性工作流程。

1、经典实施方案(包含Nuke后期部分的处理)

我不得不提一下的是,很多搞CG的人对linearworkflow都有所耳闻,网络上也有很多的教程等等,但是很多在对原理的理解上都有问题(当然这是我个人的看法),对于linearworkflow很多人采取的是“不动脑照搬”与“以讹传讹”的方式去对待,当然我说的有点夸张,本人并没有攻击他人的意思,只是希望以我个人的理解更加严谨的诠释linearworkflow,很可能我的理解也有错误,不足之处请指出。

以下是两个非常棒的人写的关于linearworkflow如何实施的blog:

Linear Workflow(线性工作流程) (三维部分-part2) ?猴子也?的MAYALinear Workflow流程

首先,我要说的是这两个博文中有关linearworkflow是写的已经很棒了,但是仍然存在一些问题,如果大家按照以上两篇博文中的任何一篇去实施linearworkflow,在场景包含32位图或者包含三维软件渲染的图片的情况下,可能会出问题,或者让你混淆。

网络上还有很多人写文章提到linearworkflow,有些写的更简单,甚至就是错的。

个人认为网络上对mentalray for Maya的linearworkflow实施方法描述最严谨最正确的是djx的博文:MayaLinear Workflow In TwoSteps,个人以为这篇文章可以作为mentalray forMaya的线性工作流程实施操作说明书来使用,由于是英文的文章,因此我将之重点内容翻译如下段。另外,还有一篇不错的有关线性工作流程的文章,LinearWorkflow, part 2 by Fredrik Averpil。

 

两步搞定Maya线性工作流程(by djx)

步骤一:在你制作任何材质、贴图或者灯光之前,创建一个mia_exposure_simple节点并连接到你渲染相机的mentalray选项卡的LensShader。设置mia_exposure_simple的参数为Pedestal=0, Gain=1,Compression=0,Gamma=2.2,由于Compression参数为0因此Knee这个参数在这儿可以无视,值随意。

步骤二:如果你读入的彩色数据图(彩色贴图)是8位图,那么将mip_gamma_gain节点(推荐) 或者是gammaCorrect节点插入到贴图读取节点(例如File节点)和材质球之间,并将mip_gamma_gain 或gammaCorrect 的Gamma参数设置为0.455(用表达式写=1/2.2最精确)。

就这两步,线性工作流程就设置完成了,且慢,以下还有几个要注意的地方:

非颜色的属性(黑白贴图):例如diffuseweight,bumpvalues,displacement,reflectivity等不是彩色的属性,都不需要添加gamma0.455进行校正。

浮点图像(16bit half float和32bitfloat):已经是linear,gamma0.455的校正是不必要的。

Frame BufferGamma:就当没这参数,保持默认值为1。

最终输出:调节材质灯光预览的时候请正常用RenderView就行了,不过渲染的时候如果是一次性渲染完成不需要后期处理的话,正常批渲染就完事。如果渲染完的图像还要进合成软件进行合成与校色,那么在你批渲染之前,请断开渲染相机上的mia_exposure_simple,或者将mia_exposure_simple的gamma参数设置为1。无论你渲染8位图、16位图还是32位图都是可以的,当然推荐32位浮点以保留高动态以及更细腻的色阶。

总结:正确实施线性工作流程的核心就是确保输入的颜色是线性的(通过应用gamma=0.455对8位图进行校正。所有的预览测试渲染请在渲染相机上挂上gamma=2.2的mia_exposure_simple节点。

 

好了,按照以上两个步骤,你就完成了线性工作流程中Maya部分的工作,那么进Nuke中怎么处理?8位图、16位图、32位图处理方法是不是不一样?我告诉大家一个简单但是好用的方法:无论你是8位、16位还是32位图,无论是整型还是浮点,进Nuke后(一定要先保证你的Nuke的viewer的LUT没有被乱改,默认是sRGB,见下图)在你文件的Read节点上一律勾上“rawdata”(见下图),然后你就按照平常该干嘛干嘛就行了,Nuke最后输出的时候正常输出(write节点不必勾选“rawdata”,切记)。什么?这方法你不信?先试试再说吧:)。



 

经典实施方案之优点:

很严谨,数值保真度最高,实现了线性灯光、线性合成,原汁原味的线性工作流程。

经典实施方案之缺点:

A、每次批渲染素材需要断开渲染相机上的mia_exposure_simple,这一点在实际项目中操作人员经常容易忘记,结果有的渲染时相机是断开的,有的则没断,出来的图像数据就会混乱;

B、给贴图加gamma节点也是很需要小心操作的环节,该加的没加,不该加的加上了...类似事件很容易发生,而且错误不易察觉,对操作人员要求比较高。

 

------------------------------------------------------------------------------------------------------------------------------------

 

2、基于“经典实施方案”的简化改良版

考虑到经典实施方案的缺点A,本人想出一套消除缺点A的简化改良版。

在Maya中:实施方法与经典实施方案一致,唯一的区别就是无论是预览还是批渲染,相机上的mia_exposure_simple曝光节点一直挂着,并且它的gamma=2.2。就这样渲染输出素材。

在Nuke中:因为Maya在渲染的时候就已经进行了gamma2.2的校正,进Nuke后除了Read节点上一律勾上“rawdata”外,还需要在每个Read节点下游添加一个Gamma节点反向校正,gamma值=0.455(用表达式写=1/2.2最精确),然后Nuke中Viewer的LUT保持sRGB不动(不做任何更改),接下来该咋合成就咋合,输出正常输出就ok了。

 

基于“经典实施方案”的简化改良版之优点:

比经典实施方案用起来更方便。

基于“经典实施方案”的简化改良版之缺点:

A、本方法最大的问题是数据精度不如“经典实施方案”高,进Nuke合成后你会发现:在贴图颜色的过渡区域和“经典实施方案”稍有不同。见下图。对于大多数情况应该无伤大雅,以一点点精度牺牲换取流程更简便,如何取舍看项目需求了。

B、如同经典实施方案之缺点B。

 



 

------------------------------------------------------------------------------------------------------------------------------------

 

3、基于Maya2011及以上版本的“色彩管理”方案

可喜可贺,Maya从2011版以来针对mentalray渲染器增加了早就该有的colormanagement(色彩管理)功能。这个和Max的VrayLWF好像设置起来是一样的了。

值得喜极而泣的,这个色彩管理的计算精度有问题,因此以下的方法理论上是对的,实际效果确实色彩是有所损失的(颜色会变得有点儿怪,说不清楚,反正没有1、2方法弄的好看)。这个方案用起来最简单,但是我没在实际项目中测试过,如有哪位同志用一下再反馈心得就太感谢了。

3.1 启用mentalray渲染器,启用色彩管理并设置如下图(另:2011中每一个file节点的色彩管理都可以单独设置,这样32位图也不会出错了);



 

3.2 设置渲染预览查看方式

在Render view下打开ColorManagement,打开“显示的色彩管理”,设置如下图。


 

3.3进Nuke后在你文件的Read节点上一律勾上“rawdata”,然后你就按照平常该干嘛干嘛就行了,Nuke最后输出的时候正常输出就行。

 

基于Maya2011及以上版本的“色彩管理”方案之优点:操作最方便,最省事儿。

基于Maya2011及以上版本的“色彩管理”方案之缺点:色彩有一定程度失真,失真的原因是否是Maya软件bug未知,能否应用于项目未知。

 

4、总结:线性工作流程很实用,尤其当你使用MR分通道渲染合成以及使用16位半精度浮点或者32位浮点的情况下。对于小规模成熟团队(渲染+合成不超过6人),使用1、经典实施方案是没有问题的,出错率不会高。如果是大型团队或者新手比较多的情况下,同时考虑到项目精度要求不是很变态的情况下,可以使用2、基于“经典实施方案”的简化改良版,关于3、基于Maya2011及以上版本的“色彩管理”方案,看起来很好,实际使用效果还有待项目验证。

 

5、附录:

给场景中的贴图批量加gamma0.455的mel:

proc addGammaCX(float $gamma)
{
//选择场景中所有的file节点
string $allfilenodes[] = `ls -type file`;
//定义下面for循环要使用的每一个file节点
string $eachfilenode;
//定义file节点所连接的目标属性
string $destinationConnections[];
//定义下面for循环要使用的每一个file节点所连接的目标属性
string $eachdestinationConnection;
for ($eachfilenode in $allfilenodes)
    {
   //存储file节点所连接的目标属性(例如lambert2.color)
    string$destinationConnections[] = `connectionInfo -destinationFromSource($eachfilenode +".outColor")`;
    //print($destinationConnections);
   for($eachdestinationConnection in $destinationConnections)
       {
       string $buffer[];
       tokenize($eachdestinationConnection,".",$buffer);
       //print $buffer[0];
       //判断file节点是否已添加gamma校色节点
       if(nodeType($buffer[0])!="gammaCorrect")
       //if(gmatch($eachdestinationConnection,"*.value")==0)
           {
           //根据场景中总的file节点连出的属性的数量创建gamma校正节点
           string $gammanode =`shadingNode -asUtility gammaCorrect -n("CX_Gamma")`;
           //print ($gammanode+"n");
           //连接file节点的输出给gamma校正节点
           connectAttr -f ($eachfilenode+".outColor")($gammanode+".value");
           //连接gamma校正节点的输出给file节点原始的输出连接(例如lambert2.color)
           connectAttr -f ($gammanode+".outValue")$eachdestinationConnection;
           //设置gamma节点的gamma校正数值
           setAttr ($gammanode+".gammaX") $gamma;
           setAttr ($gammanode+".gammaY") $gamma;
           setAttr ($gammanode+".gammaZ") $gamma;
           }
       }
    }
};
addGammaCX(0.455);

 

一些解释性图片:

上图为线性空间与sRGB空间示意图

上图为sRGB与Gamma 2.2(反向校正)的大致匹配度

上图为显示屏的“电压-亮度”响应曲线与gamma2.2(正向校正)的示意图

 

二、VUE与Nuke结合的线性工作流程

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
houdini大神自诉:为什么我要放弃maya I
Arnold 线性工作流程
专业干货:手把手告诉你科学的RAW素材后期工作流程
【heronuke】maya和nuke搭伙儿做动画?真的可以吗?
ABOUTCG发布NUKE高级跟踪与合成技术速成指南
官宣:Nuke五分钟搞定头像建模!MAYA、ZB要哭了…
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服