2008年12月5日星期五

mom

2008年11月19日星期三

David Kim

CGTalk上一幅二维作品,挺有意思:)

2008年11月18日星期二

Mental ray Motion Blur 试解决方案和 mip_motionblur mip_motion_vector shader

Mental ray Motion Blur 试解决方案和 mip_motionblur mip_motion_vector shader


基于Mental ray渲染Motion blur现在有几种解决方案:

  • 3D
    • 纯3D Motion blur
    • Rasterizer
  • 2D 后期
    • 在maya内应用mip_motionbur
    • 后期Motion blur, 通过Motion vector。

纯3D Motion Blur 渲染的图片最真实,反射,折射,GI等都不会有问题。但是缺点是速度慢,为了提高动态模糊的渲染质量需要不断的提高sample 和 temporal sample 的值,占用大量的渲染时间。渲染速度和质量(sample)是成一种linear的关系。

Rasterizer 优 点是速度快,比raytrace motion blur要快很多,能够很快的实现高质量的motion blur。它将shading和sample分开进行,极大的提高渲染速度。因为这种特点渲染速度和质量(sample)不是一种linear关系。另外 他的sample方式也与raytrace不同。但是由于这种方式的特点不适合对反射和折射要求较高的场景应用。渲染头发是应用这种渲染方式加 detailed shadow map。另外不适合应用fg,gi caustics,auto volumn, raytraced shadow, ray bending lens shader, reflect refract.

2d,后期的motion blur是 基于二维平面的动态模糊。优点是节省渲染时间,三维渲染不需要渲染motion blur。调整快,可以说是实时的。在后期调整时非常灵活如果是渲染的motion blur如果有问题就需要到三维里重新渲染,在后期里调整就不需要。在后期里可以得到实时的反馈根据需要任意调整动态模糊的幅度。缺点是不准确不能模糊反 射折射的情况,不能有multisegment motion blur,动态模糊都是直线的不会有弧线的,另外后期软件对其支持也不禁相同还有很多限制。2d的motion blur主要是通过三维软件渲染motion vector通过后期软件调整。除了这种方式,Mental ray提供了一个output shader:mip_motionblur shader. 这个shader 通过利用motion vector 和 depth frame buffer对渲染出来图片进行处理。由于是集成于渲染器它的优点是拥有一些后期软件没有的功能。而motion vector shader主要是用于输出针对不同后期软件处理动态模糊需要不同motion vector图像而写的shader。

对于3D motion blur,最重要的渲染速度而这主要是取决于整体的sample和temporal sample在maya内由time contrast 控制。这个参数是主要影响动态模糊速度的。


mip_motionblur, mip_motion_vector具体应用方法。

应 用这两个shader都需要将motion blur选项开启,但是要保证shutter interval 为零。看具体情况考虑,为了后期考虑有时应将物体停在shutter interval的中间这样方便向前后两个方向动态模糊。比如shutter open 是0 shutter close是1,在启用这个shader的时候要两个值都为0.5。即 shutter open 0.5 shutter close 0.5。这样会关闭motion blur但是会计算motion vector。同时将time contrast改为1,避免mental ray 作不必要的计算。




这两个shader都是output shader 但是连到maya 2009 camera 的output shader里并不可用,只可以使用以前的链接方式。默认情况下此界面在camera attribut editor里是被隐藏的。方法倒很简单将output shader拖动到相机上选择 default 就可以了或者使用connectio editor 同时要启用 motion vectors, depth framebuffer。







关于两个shader的具体参数,可以直接参看官方的production shader documents. 这里需要强调一下的是如果在nuke中作motion blur,首先需要将mip_motion_vector中floating point format 改为1, pixel threshold 最小要写0.001否则会有artifacts(图像某些不动的部分会有值)这个值是告诉mentalray多小的像素移动可以忽略不记。这样nuke的vector blur节点才能正确读取mental ray 输出的motion vector信息。其他插件和软件对motion vector要求不一样,要看具体要求输出。



使用 nuke 自己的 vector blur shader 还是不能很好的模糊需要动态模糊的部分和其它背景同在一个rgb通道内的图像,如果需要动态模糊的部分外边没有rgb信息可以很好的模糊图像,如果有,效果没有reelsmart motion blur效果好,但是RSMB一样有些问题。暂时还不知道是不是我的设置有问题。

5.1v2 的vector blur结点坏了,foundry已经确认,下个版本修正...不用试了。


2008年11月9日星期日

匹配颜色 (Matching the lightspace) 笔记

匹配颜色 (Matching the lightspace) 笔记

这里的匹配颜色方法主要是基于一条逻辑色思路。首先匹配明度和对比,然后颜色方面的。接着是灯光方向,灯光质量,灯光效果,阴影,和颜色现象。

现在假设一种情况是,用前景来匹配背景,背景已经是被color grading过的。

1.Brightness and contrast.

  1. 这一步只要是匹配black point 和 white point 。理论上black point就是漫反射2%光线的黑色物体表面的像素值。White point 是漫反射90%光线的白色物体表面的像素值。对8位linear图来说black point一般是第10个色阶(值0.04)。当然实际工作中不一定就是匹配这几个值,也许图片中跟比就没有这么“黑”或这么“白”的像素点。我们只是匹配素材中相应的black and white point。工具一般用一条曲线的input和output控制就可以了。
  2. 匹配Contrast要用 S 形curve,因为不会clip。
  3. 还有 matching the midtones要基于我们已经定好的black point 和white point。就是可以给予同一条曲线上加点调节。
  4. 当我们把在制作电影需要转到video的时候black point 如果匹配的不好容易出问题。我们在匹配的时候可以试着把显示器的gamma 调高再调低分不同情况在看一下。

2.Color Matching

  1. 当匹配颜色的时候我们需要对全局匹配也需要对个别物体匹配,因为在不同光照环境下物体对光的反映是不一样的。比如一个人穿着一件衣服在室外和在室内,肤色和衣服对光的反映是不一致的。对于匹配颜色我们一般将纯灰色物体和肤色作为参考。
  2. “constant green” 较色方法,就是绿色不动,动其他的颜色。因为绿色对明度影响太大,动一点就很容易被察觉到明度的变化。明度的RGB分布比例为G 59%, R 30%, B 11%。
  3. 在室外的场景要想到,物体一般收两个光源的照射太阳和天空,太阳偏黄,天空偏蓝。收太阳照射的地方一般偏黄些,不受太阳直接照射的部分一般偏蓝些。
  4. 关于高光点,如果要降暗高光点的话,记得要增加饱和度或者添加颜色。因为在过度爆光部分RGB是被压缩了的,所以看起来会“grey”一些。

其他暂时没什么要注意的。需要再补充吧。

2008年10月28日星期二

Maya 2008 2009 Mentalray 隐藏shader (production shader) 调用方法

Autodesk 给Maya内部集成了一些mentalray的production shader 但是由于没有经过全方位的测试,还没有正式公布出来不过大家可以通过修改maya文件把这些东西调用出来。这些shader的主要用途方便cg与实拍更有效的结合,加速生产流程。这些shader已有很详细的官方文档 。


Maya 2008 production shader 调用方法 打开文件:../scripts/others/mentalrayCustomNodeClass.mel

找到

// Internal MentalRay Nodes. Not meant to be used with Maya.          
if ($nodeType == "misss_physical_phen"  ||             
 $nodeType == "mip_rayswitch" ||             
 $nodeType == "mip_rayswitch_advanced" ||             
 $nodeType == "mip_rayswitch_environment" ||             
 $nodeType == "mip_card_opacity" ||             
 $nodeType == "mip_motionblur" ||             
 $nodeType == "mip_matteshadow" ||             
 $nodeType == "mip_cameramap" ||             
 $nodeType == "mip_mirrorball" ||             
 $nodeType == "mip_grayball" ||             
 $nodeType == "mip_gamma_gain" ||             
 $nodeType == "mip_render_subset" ||             
 $nodeType == "mip_matteshadow_mtl" ||                 
 $nodeType == "surfaceSampler" ||                 
 $nodeType == "mip_motion_vector")                  
 return "rendernode/mentalray/internal";          
 return ""; }

改成

// Internal MentalRay Nodes. Not meant to be used with Maya. 
// So? Should poor Maya users use 3dsmax? C'mon... ;) 
  
if ($nodeType == "misss_physical_phen"  ||               
 $nodeType == "mip_card_opacity" ||                   
 $nodeType == "mip_matteshadow" ||               
 $nodeType == "mip_matteshadow_mtl" ||      
 $nodeType == "surfaceSampler") 
return "rendernode/mentalray/material"; 
return "";}     
 
if ($nodeType == "mip_rayswitch" ||                   
 $nodeType == "mip_rayswitch_advanced" ||          
 $nodeType == "mip_cameramap" ||          
 $nodeType == "mip_mirrorball" ||         
 $nodeType == "mip_grayball") 
return "rendernode/mentalray/texture"; 
return "";} 
   
if ($nodeType == "mip_rayswitch_environment") 
return "rendernode/mentalray/environment"; 
return "";}     

if ($nodeType == "mip_motionblur" ||      
 $nodeType == "mip_motion_vector") 
return "rendernode/mentalray/output"; 
return "";}   

if ($nodeType == "mip_gamma_gain" ||      
 $nodeType == "mip_render_subset") 
return "rendernode/mentalray/lens"; 
return "";}


Maya 2009 production shader 调用方法

在Script Editor 里面敲入 optionVar -iv “MIP_SHD_EXPOSE” 1

重启Maya打开hypershade就能看到新shader啦。


2008年10月25日星期六

Linear Workflow (线性工作流程)

Linear Workflow (线性工作流程)


1, 什么是线性工作流程?

线性工作流程确切的说是匹配软件的线性工作流程。这种流程在近几年被广泛应用于电影广告等高端项目。国外大型工作室几乎都是基于这种流程。实际上我们需要物理上正确的计算,那只能是基于线性工作流程。不幸的是,我们以前都不是基于这种流程。就是说理论上我们以前和现在几乎所有的maya渲染,后期制作都是基于错误的计算方式。能够接受它是因为我们在错误的基础上让它看起来“好看”(其实并不正确)。


那么具体什么是线性工作流程呢?线性工作流程就是软件在计算时,所有参与计算的数据都是基于线性的。我们使用的几乎所有图像处理软件都是基于线性的计算方式。就是说 1+1=2 2*2=4 128+128=256。我们使用的maya, maxnukeshakefusionphotoshopmentalray, maxwell都是这种计算方式。这种流程的正确的前提是它在计算前所有的素材,条件,灯光都是线性数据,1代表的是15代表的是5。但是我们现在的流程是非线性的(错误的)。主要原因:

  1. 输入的是错的。(素材是非线性的sRGB空间。)

  2. 操作是错的。(基于错误色彩空间进行测试maya操作(打光,渲染,输出)。输出的图片是线性但在sRGB空间下观看。)

    1. 2 + 2 = 10 (灯光师的感觉,灯光易爆)

    2. 不能应用2次方衰减

    3. Mentalray的物理渲染

    4. 取色器。

    5. 所有对材质的调整

  3. 输出是错的。(输出的是线性空间下的8bit 16bit,但不进行调整)


2,基本概念

如果我们要充分理解线性工作流程首先需要弄清几个概念。LinearsRGB, gammawindous 色彩管理,显示器部分原理,眼睛的部分感官特点,8bit, 16bit,32bit.


3,先从显示器说起,我们常说“CRT显示器的gamma2.2,苹果是1.8”这种说法是不正确的。

什么是gammagamma是一个非常模糊和不精确,被乱用的一个概念,现在其已经几乎被禁止使用的一个单位。它最早是用来表述胶片曝光的log曲线和胶片线形密度的关系。后来被各种工业部门用来表述类似的关系,数学上大概可以表示为:

y = xr2.2







曲线的形式





我们常用的CRT显示器,不论他是苹果的还是什么的出场的时候本身的物理gamma值都是2.5。主要原因是撞击显示器荧光粉的电子强对于电压的反应不是线形。大概可以用gamma 2.3 – gamma2.5来表示。而如果我们应用这种显示器看图片,图片明显看起来会暗很多。所以不同的应用领域对此作了相应的补偿,video主要是在摄像机里进行了gamma2.2的矫正,PC电脑在framebuffer之后进行了gamma2.2的矫正。Mac分别在framebuffer之前进行了和之后分别进行了矫正。那么显示器的gamma2.5我们只给了2.2的矫正剩余的2.5/2.2 gamma1.136是用来匹配人类视觉感知的。人眼有这么一个特点:


同一块颜色在暗的背景下和亮的背景下看,给人亮度的感觉是不一样的。在暗的背景下感觉会更亮一些。而我们正常的显示器一般都是在较暗的背景下看的。在标准的测试环境下gamma1.136正好可以抵消这种视觉偏差。所以我们在理想情况下看到的显示器是线性的。

(如果我不说显示器的gamma,不了解的人会以为显示器有gamma,这样一来很多理论会说不同。)


那么我们正常情况下所说的“CRTgamma2.2”指的是什么呢?这就涉及到了windows色彩管理:默认的sRGB。我们目前的显示器只能显示8bit图,大多数显卡的framebuffer 也只能处理8bite数据,就是说超过8bit的图片显示器是不能完全显示出来的。

就是说我们只能给显示器8bit的图,这就出现了一个问题。又是人的眼睛。


正常人眼察觉明度差别的边界是1%,就是说如果两块颜色明度差别超过1%我们的眼睛感觉到边界。图片里就会出现边界线条。那么8bit的图在100色阶以下,明度对比都超过1%,在较暗的场景里就会出现很多的颜色边界。那么这是发生在 linear 8bit空间下的。linear就是说0是最暗,1是最亮,0.5是中间亮度。为了解决暗部色阶不够明度差别过大我们只有将更多的空间分布给黑暗的区域才可以取消这种差别。如果是线性需要大概14bit的数据,而亮部很多数据是无用的。这就引进了非线性空间。


sRGB是微软和惠普联合开发的一个色彩管理标准,目的就是在多平台,多设备下能够很好的显示图片。基于硬件的局限它被定义在8bit,最大值为1不可以超过1



这个色彩管理标准将更多的空间给了暗部,解决了暗部色阶不够问题。而这个曲线恰巧去gamma2.2极其匹配。Window应用这种色彩管理标准作为默认设置。因为window知道sRGB空间的特点所以它能够正确地显示sRGB的图象,比如这个像素的值是0.2他会让显示器发出0.12倍的电压。我们日常应用的大多数8bit 16bit图片都是基于这个标准的,比如最常用的jpgtiftarga 等。




因为gamma2.2sRGB的曲线非常接近,我们很多情况下的色彩空间转换,匹配都应用一个简单的gamma2.2操作。sRGB很好,它能很高效的应用数据显示图像,但是在我们进行图形操作的时候会出问题。因为sRGB是非线性空间。 因为他把更多的值给了暗部,0.5并不代表0.5而是0.21左右。但是我们日常应用的软件并不知道他读入的图片的色彩管理模式它全部以linear空间来进行计算。这时候就出问题了。



3d渲染得时候出错的地方

    1. 2 + 2 = 10 (灯光师的感觉,灯光易爆)

    2. 不能应用2次方衰减

    3. Mentalray的物理渲染

    4. 取色器。

    5. 所有对材质的调整

    6. 测试观察的图片时错误的

    7. Etc


后期操作时再不转换色彩空间的情况下各种操作也不够精确。(也就是错误的)。



在这里首先要说一点。Mayamentalray, renderman,等大多数渲染器渲出来的8bit, 16bit图片都是linear的。也就是说没用经过gamma矫正(转换到sRGB空间)。而我们是在windows默认sRGB空间下观看。我们只有在sRGB空间下看sRGB空间的图片才是正确的。



  1. sRGB空间下看线性图片的问题(二次方衰减)。涉及在sRGB空间下看linear图片的问题。对比曲线,指出sRGB色彩管理会将linear图片变暗显示,因此我们要正确显示linear图片需要将其变亮,因此给一个gamma 0.45454的值。这也是我们为什么不能应用灯光二次方衰减的原因。我们如果需要将linear图片变亮,只能不断的提高强度而我们输出8bit图,值只能卡在第256个色阶上,所以我们以前不能应用二次方衰减。

  2. 用曲线表示两个sRGB值相加的问题2+2=10。一幅图片上两个像素点。在sRGB上分别标出两个点的位置对应指出他们在sRGB曲线上和linear曲线上分别对应的值,分别相加。想象得到的这个值是用sRGB来显示的会是什么样的?这是个简化的相加原理。指出渲染器取的值是linear 上的值。

  3. mentalray的物理渲染要求更精确如果素材错误结果很难调整。

  4. 我们的取色器是错误的



具体应用方案

因为我们已经理解了原理,具体解决方案就不会晕了。


首先介绍两个节点。Gamma correction node, mia_exposure_simple



比较理想的解决方案:基于32 bit float point 输出,这样我们就不需要考虑输出时gamma矫正的问题,这部分在后期里操作。


输入:对所有非linear图片进行转换。

  1. 照片和photoshop处理的图片基本上都是gamma2.2。给以gamma0.455的矫正。

  2. 3d输出一般都是linear。不需矫正。

  3. Bumpdisplacement不需矫正。

  4. 32bit float point. Openexrhdr,一般是linear不需矫正。


测试察看:

Mentalray: 加一个mia_exposure_simple.

Maya software: batch输出tiff16, 在后期里矫正察看。


输出:

Mentalray: 8bit 16bit mia_simple_exposure photographic(比较复杂)。因为这是在mentalray内部浮点形式进行的gamma0.4545转换。在后期里会有损失但是对于16位可操作余地更大。

Mentalray32 bit float point 不加任何节点,直接输出Openexr格式。在后期里进行调整。

Maya software: 输出tiff 16 在后期里进行调整。


例子:一个标准的操作。


Openexr的优势:

Simplified pixel math

Rendering

Filtering

Transformations & Drawing

Color correction


Openexr 例子,

Nuke基于线性操作更精确的例子。


2008年10月23日星期四