本篇教程我们来综合讨论三组着色器:Conversion / Math / Shading state,以及各自包含的各个节点。
在讲解之前,先说一下有关数据类型,之前提到过一些,这里再强调一下。Arnold的节点数据类型主要分为三种:Float,Int,Vector。Float是浮点数,Int是整数,Vector是向量。在图形计算中,这三个数据类型计算方式会有所不同。
Conversion
首先是Conversion,直译过来就是“转变”的意思。这组节点能够用于转换不同的数据类型。包含8个节点:
这组节点其实没什么特别的,关键还是理解各个数据类型的用途。
【Float】浮点数,模糊数据
【Int】整数
【RGB】RGB颜色
【RGBA】RGB+Alpha(透明度)
【Vector】矢量
举个栗子:
比如要使用noise作为gobo滤光镜的slide map,就需要用float_to_rgb(将浮点数转换为RGB)节点。
简单演示一下:
① 打开准备好的场景,创建一个体积散射节点,丢到渲染设置大气层栏:
② 创建gobo滤光镜并丢给灯光:
③ 创建noise节点,输出到gobo>slide map,可以看到IPR Window中显示有些奇怪,这是因为我们输入的是一个浮点数,slide map需要的是rgb数据,因此需要转换一下:
④ 新建float_to_rgb节点,并将noise连接到r、g、b;然后将float_to_rgb节点连接到gobo>Slide map:
⑤ 调整noise节点属性,就能够明显看到变化了:
以上就是Conversion的使用方法,很好理解,就是各种转换,就不赘述了。
Math
Math节点可以对各类数据进行计算,可以处理颜色(color)或矢量(vector)的输入。包含27个节点:
这一部分的节点使用率相对较低,如“Math”这个名字所示,下设小节点可以说是一种计算方式,有各种公式,例如使用【abs】最终返回的数据是输入数据的绝对值;【Add】返回input1+input2(例如叠加噪波效果);【Atan】使用两个参数来确定结果的象限.....有很多关于余弦/正弦/三角函数什么什么的公式(emmmm....再往下我也不知道我说的是啥了 虽然我不是文盲 嗯 不是)摸着良心说,这一部分节点我用过的也很少,【Random】之前有讲过,主要就是自由变换,没看过的童鞋可以去看看→传送门;【range】可以用来确定“范围”,例如可以产生类似于PS的“蒙版”效果,遮罩哪一部分/显示范围。。。。剩下的一些生僻节点,以后实例涉及到再来讲。
如果要类比PS的话,勉强可以算是各种“滤镜”,经过计算产生各种效果。
Shading state
可用于读取对象的各类属性,如UV、光线深度等。主要读取三种数据类型:
-
【state_float】参数详解:
state_float参数
名称 | 变量 | 描述 |
---|---|---|
Screen XY | sx,sy | 图像空间坐标,范围 [-1,1) |
Shutter Time | time | 对于运动模糊,当前样本被遮蔽的绝对时间。 shutter-open到shutter-close所用时间。 |
Ray Length | R1 | 对于曲面着色器,指来自摄像机的射线或之前射线的反弹射线,到着色点的长度;对于体积着色器,指要着色的体积片段的长度。 |
Barycentric UV | bu, bv | 对于三角形,指三角形的重心坐标;对于曲线,指曲线的长度和宽度参数坐标。 |
Surface UV | u, v | UV坐标通常用作纹理坐标。 如果没有提供uvlist或uvs参数,则与bu和bv相同。 |
Shaded Area | area | 当前着色点覆盖的面积差异,通常用于纹理过滤(texture filtering)。对于曲面着色(surface shaders)器来说,光线微分(ray differential)跨越这些区域;对于位移着色器(displament shader)来说,它是围绕光线路径顶点的三角形的平均面积。 |
UV Derivatives | dudx, dudy, dvdx, dvdy | 相对于XY像素坐标的UV导数。 包含从当前像素到相邻像素的右侧和顶部的UV变化率,通常用于纹理过滤。 |
Shutter start and end | 运动模糊开始至结束的时间的绝对值。 |
-
【state_int】
state_int参数
名称 | 变量 | 描述 |
---|---|---|
Raster XY | x,y | 光栅的空间像素坐标,相机光线起点 |
Subpixel Sample Index | si | AA sample指数,范围[0,AA-Sample] |
Ray Type | Rt | 入射光线类型 |
Transparency Index | transp_index | 透明度指数 |
Thread ID | tid | 线程ID,具有唯一性 |
Bounces | bounces | 光线在当前着色点的反弹次数 |
Diffuse Bounces | bounces_diffuse | 漫射反弹次数 |
Specular Bounces | bounces_specular | 镜面反射反弹次数 |
Reflection Bounces | bounces_reflect | 反射反弹次数 |
Transmission Bounces | bounces_transmit | 透射反弹次数 |
Volume Bounces | bounces_volume | 体积反弹次数 |
Force Hemispherical Lighting | fhemi | 强制半球形照明 |
Primitive ID | fi | 原始ID(例如三角形原始ID是triangle) |
Number of Active Lights | nlights | 影响着色点的有效照明数量 |
Inclusive Traceset | inclusive_traceset | 如果使用了tranceset(跟踪),是包含关系还是排除关系 |
Skip Shadow Rays | skip_shadow | 如果开启,则照明时不追踪阴影射线 |
Shading Context | sc | 着色的前后关系类型(surface,displacement,volume,background,importance) |
-
【state_vector】
state_vector参数
名称 | 变量 | 描述 |
---|---|---|
Ray Origin | Ro | 对于surface来说,指光线原点;对于volume,指volume segment被遮蔽的开始点 |
Ray Direction | Rd | 从光线原点到shading point的光线方向;对于volume,指volume segment被遮蔽方向 |
Shading Point in Object-Space | Po | Object-Space中的着色点 |
Shading Point in World-Space | P | Word-Space中的着色点 |
Surface Derivative wrt Screen XY | dPdx, dPdy | 相对于XY像素坐标的表面导数 |
Shading Normal | N | Shading法线,包括smooth normals和bump mapping |
Face-Forward Shading Normal | Nf | 正面shading法线 |
Geometric Normal | Ng | 几何法线,不包含smooth和bump |
Face-Forward Geometric Normal | Ngf | 正面几何法线 |
Smoothed Normal without Bump | Ns | smooth(平滑)法线,没有bump |
Surface Derivative wrt UV | dPdu, dPdv | 相对于UV坐标的表面导数(未标准化),可用作各异向性着色切线或矢量位移 |
Ray Direction Derivative wrt Screen XY | dDdx, dDdy | 光线方向导数wrt XY像素坐标 |
Surface Normal Derivative wrt Screen XY | dNdx, dNdy | 相对于XY坐标的表面法线导数 |
举栗子时间:
P.S 以上这些值翻译过来真的是一言难尽。。。很多词语的翻译也没有什么标准,很不好表述。比如 Shading,在图形学中,翻译成“着色”是不准确的,还有Ray翻译成“射线”还是“光线”?好像都不太准确。。。对于设计师萌来说,请不要深究。。。。surface normal 是用来shading的..很多用途..如果要模拟非常逼真的光效应,必须用到surface normal,并且配合Phong Shading or Gouraud Shading。可以得到很好的视觉效果。。。好了,不说了,再说要开始讲图形学了。。。
敲黑板、所有的软件都是工具,最重要的还是你的创意、你的思维,所有工具都是为了更好的呈现你的创意以上看不懂就别看了,要想完全看懂,可以去深造一下图形学?
禁止私自转载。
转载务必告先得到老夫同意。
网友评论