Katana批量镜头生产年初时接了个网大灯光渲染的活，活比较简单，但问题就是镜头量有一些大，而且甲方要的也紧。根据当时的要求，平均一天要产出15个左右的镜头才能按时交付（蛋疼的时我当时只有晚上有时间|´・ω・)ノ）。甲方提供了maya的动画文件以及ref的绑定资产，材质已经是直接在绑定文件上做好的。第一天测试发现maya文件加载卡顿，按我当时预想，准备用render setup来批量生产。在做到第二个镜头时，我maya就已经崩溃过三次，尤其在arnold IPR渲染和切换窗口操作及为不稳定，虽然之前也有心理准备，但没想到如此的不顺，按此种方式我一天即使通宵也不太可能完成！那就考虑换平台，首先想到的是Katana，我在上家公司已经利用katana完成了两个网大项目的批量生产，我负责搭建setup，批量性生产的工作就交给灯光师来完成。当时一个中级灯光师的产量一天可以达到50个。之所以可以稳定高效的生产，得益于我对资产及跟踪和动画的把控上，从最初阶段就开始要求统一标准化生产，包括几何体命名，文件命名以及储存格式和路径。根据可寻的规则才能让Katana完成批量化的生产。但此项目是外包的，根据发来的文件可以判断甲方对于命名和文件管理上并没有严格要求。存在不同版本的rig文件，动画加载的ref的路径以及跟踪相机的命名都不统一等问题，应该是甲方分发不同团队制作完成的。转换资产动画文件及绑定与材质文件全部是maya格式，首先需要完成将现有资产全部转换为通用格式，并且在Katana中对模型装配材质，导出Alembic面对这些文件可能已经没办法依赖于现有的脚本工具来批量完成导出资产的工作。为了不耽误时间，我用了最笨的办法。我耗费了一个晚上，将所有镜头的动画文件中角色及相机分别导出abc文件，这里没有使用usd是去年在用katana3.6时发现usd并不太稳定，经常会发生崩溃，力求稳还是选择了保守的alembic。导出当然是需要统一命名和路径，对于绑定文件，只导出geo组就可以，但要保证每个文件导出的层级都一至，针对多个道具及角色，尽可能分别导出不同的abc文件。在这之前我已经用cgtw建立了每个镜头的目录，用来存放动画Publish出的abc缓存，导出为和节省时间，我写了简单的mel做为书架菜单来执行操作。导出相机时检查overscan值是否异常统一路径及文件名称统一层级导出只导出几何体组而非CV线等不必要的“垃圾”数据面对多个资产则分别导出无动画信息的物体导出时选择current frame确保勾选UV write及World space若有面材质确保构选Write Face Sets若有多uv set确保构选Write UV Set转换材质maya中的材质连接得比较随意，虽然都是使用aiStandardSurface，但贴图并不是标准的Metal / Roughness方式，并且还有大量的颜色调整节点，而且这部分节点并非全部使用的是arnold的shader。如果使用MaterialX，肯定会有一些节点无法转换成功，那么先前就需要先在Maya里将那部分节点去替换，并且保证材质效果的一至性，另外还有一个坑，MaterialX对于层级及名称的要求是非常严格的，否则后面都将无法进行。另外一种方式就是比较传统的直接在kat里创建对应的节点去把材质效果还原，如果有TD的帮助可以用脚本工具实现快速的转换，当然在Kat中还原也是要依赖于arnold的shader，因此在maya中还是要替换成arnold shader或者是在kat里测试替换以保证效果和maya中的一至。考虑到MaterialX的坑，还是用了“笨”办法，直接在kat中按maya的参数及连接做一遍。需要注意下贴图的色彩空间问题因为所有的贴图已经在maya中转换为对应Color space的tx文件，因此在Katana中的贴图也直接读取.tx文件，但这个时候在Color space中应当选择使用linear，否则会错误的再次对tx文件进行Color space转换。针对完整的一个资产，将材质集中在一个ShadingGroup中，方便不同场次镜头调用。下面是整合后的材质包Katana的镜头模板搭建Katana的相比Maya最重要的一点优势就是可以通过搭建Setup来提高整个项目的生产效率，而且在没有TD的帮助下普通灯光师就可以完成。首先需要明确Setup模板的用途和定位，是针对某一效果，是针对某些镜头，还是针对整个场次，还是针对所有场次。也就是从小到“微观”的Setup到“宏观”模板框架，或可理解为在一个通用的框架内是由许多个小Setup构成。既然是Setup，首先应当考虑它的“通用性”和“易用性”。针对此话题我会在后面的文章中单独叙述。明目了上面的内容，那么就先要完成这个框架的建设。总体框架大概如下图GEO IN：导入资产，包括相机，这里按镜头做为一个包，创建collection组，此功能类似于maya的set，最后用Prune节点来删除不需要参加渲染的物体。OBJ SET：将导入的资产创建Arnold的物体设置，完成包括渲染细分，不透明，置换等常用设置。CameraClippingPlaneEdit节点用来设置相机的裁切范围。LOOKDEV：这里存放着之前lookdev发布的材质设置，最后通过MATERIAL_ASSIGN_STACK来完成对物体的材质指定。LGT：GafferThree的灯光设置。AGS：ArnoldGlobalSettings arnold的全局设置。这里可以用RenderFilter功能，来做不同质量的切换，提高生产效率。AOV：Arnold输出的AOV设置。RS：渲染设置，指定相机，输出通道，渲染分辨率等。Render：设置渲染帧范围。GEO IN部分主要是导入资产，包括角色，道具，场景，相机等。LOOKDEV中是之前的材质包。AOV中分为两部分，crypto和AOV，因为目前的版本中crypto无法与其它通道合并为一个exr文件，因此在这里分为两套序列。以上就是整个的框架，其实AOV和AGS，RS等，都是常用设置，这里可以理解它们为小的setup，只要渲染器不变的情况下，它们都是有一定通用性的，比如不同项目或者不同场景镜头，无非是修改个别参数而已。我个人也是将这些提前做好，针对不同项目随时调用，如果每次都重新搭建，仅就AOV中的内容，就需要耗费许多时间（当然可以利用其它脚本工具或者第三方的Supertool来自动化完成）。下一篇章讲会谈使用变量来批量完成多镜头的生产，以及最后提前农场的过程。
Ktoa渲染输出Motionvector主要是两种方法，直接使用AOV预设的motionvector层，另一种是使用自定义AOV shader通过motion_vector Shader去计算运动矢量数据。使用AOV预设输出Motionvector首先在渲染设置中（注意并不是arnoldglobalsettings节点）将快门值设置好。在arnoldglobalsettings节点上将output_motion_vectors勾选。在arnold output channel define节点上的channel中直接填写“motionvector”，它是渲染器已经含有的预设，之后设置好renderoutput输出位置，就可以正常输出了。使用AOV Shader输出Motionvector首先创建AOV Shader，使用arnold的motion_vector shader，并激活“raw”选项。在渲染设置中（注意并不是arnoldglobalsettings节点）将快门值设置好。在arnoldglobalsettings节点上将output_motion_vectors勾选，并将aov shader添加进来。设置好arnold output channel define和renderoutput，注意通道名称应与aov shader上的一至。
Cryptomatte默认使用了Asset ，Object以及Material 三种ID，但实际生产中，往往可能需要自定义些其它类型ID，Cryptomatte也支持使用自定义属性来区分ID。创建cryptomatte节点创建一个Arnold shader network，在其中创建AOV Output以及cryptomatte节点，在cryptomatte的user中，添加自定的AOV名称以及ID属性名称：给物体添加string类型属性使用Attribute Wrangle，在primitives上添加字符串属性，属性名称就来自于之前cryptomatte定义的data的名称。在渲染输出中添加对应AOV在arnold output设置中，在AOV Shader接入之前创建的aov节点，并创建AOV输出，选择之前定义的AOV名称选项。
基本概念Primitives (prims)prims是USD的基本“单位”，在谈论USD时，"Primitive"通常缩写为"prim"。类似于在HTML中的 "element" 。prim有一个名称，0个或多个命名属性，以及0点或多个子级，例如，多边形网络是个prim，灯光是一个prim，材质是一个prim。"xform"prim存储适用于其子prim的transform。Prims是定义阶段的对象树中的“节点”。Properties特性, attributes属性, relationships关系"Property" 是可以附加到prim类型的两种命名数据的通用名称：Attributes属性:属性是描述prim的类型化值（例如整数，颜色，变换矩阵，数组等）（例如，float size = 1.0定义Cube Prim的统一大小）。这是最为常见的property。Relationships关系：关系是在一个prim和另一个prim之间建立的链接（例如，指定对mesh prim的shader要使用的材质，或指定collection中的primitives）。Metadata 元素据属性本身可以附加有命名值，这可以修改它们的工作方式，例如，如果为mesh指定颜色primvar ，则可添加interpolation元数据，该元数据指定渲染器应如何在这些点的颜色之间混合。元素据还用于附加“附加”数据，这些数据可能特定于DCC，或者对于调试或构建用户界面很有用。例如，不同属性的文档存储在元素据中。Layers层一个.usd文件是一个层（.usdz文件，一个文件可以在一个存档文件中包含多个层）。一个层可以表示场景的一个片段，例如，道具，角色，装备的一部分，灯光设置等。它还可以表示用来创建基准的默认值，例如包含镜头序列设置的图层，您可以在代表该序列中每个镜头的文件中reference这些设置。在Houdini中，各种节点创建新的内存层以覆盖现在数据。您可以使用Layer Break LOP手动创建一个新层，一个典型的LOP网络将涉及许多层。其中一些层是从磁盘导入的，某些层是由节点在内存中创建的，最后由这些层组成。（network editor中的可选可视化工具向您显示了网络中哪些节点在不同的层上工作。）Composition arcs 合成操作符从一层到另一层的引用。例如，场景图层可能会reference进包含道具，灯光等图层。这些图层可能reference自己的子层，这些子层可能会reference子子层，依此类推。将各层复合在一起，合并每层中的prims。较高层中的属性将覆盖下面的属性。例如，场景文件可以reference灯光层，但是灯光部门可能已经从 "base defaults", "finished lighting", 和"in-progress lighting"的三个子层组成了该层本身。其他部门不需要知道灯光层是如何组成的，他们只需要reference顶级的lighting层既可。在Houdini中，可以使用Reference LOP ，使用LOP网络中的节点将参考添加到要在内存中构建的层。你可以使用 Sublayer LOP将现有子层（.usd文件）加载到当前阶段的层堆栈中。Stage舞台当加载USD文件和系统组成的所有层结合在一起来计算prims的最后场景图，该结果被称为Stage。请注意，stage只是结果的名称。“stage文件”和“layer文件”之间没有区别，如果将.usd文件加载为"top-level"文件，它将创建一个新的stage。在另一种情况下，你可以将同一文件作为不同stage的图层引用。在Houdini中，位于网络项部的LOP节点创建一个stage，随后的每一个LOP会按程序修改该阶段的内容，从而创建一个新阶段。因此，对于任何LOP节点，您都可以使用hou.LopNode.stage()获取该节点输出的stage对象。您可以usda通过右键单击LOP节点选择LOP Actions ▸ Inspect Flattened Stage来查看节点以语法形式显示的stage输出。组成每个USD文件都包含完整的“场景”。USD文件可以将其它USD文件的内容导入为图层。USD库包括用于将多层合成、叠加到顶层文件创建的整个场景(stage)中的软件。组成包括合并各层之间的以下差异：New prims.（新prims）。Prim ordering.（Prim排序）。Whether a prim is active or inactive.（prim是活动还是不活动）。Variants.（变化）。New properties (attributes and relationships).（新特性（属性和关系））。Attribute values. (Higher layers can even "block" (unset) the value of an attribute so it appears to be unassigned).（属性值）。Metadata values.（元数据值）。Houdini会自动组合您在编辑USD时创建的各种磁盘和内存层。你还可以使用工具来了解每个图层上的内容以及图层的组成方式。Sublayers, referencesUSD具有两种“导入”另一个USD的内容的方法：sublayering 是将导入文件的树覆盖在当前树上，而reference是将导入树的内容作为分支附加到现有树上。你可以将sublayering视为组成整个场景的不同版本（例如，将照明部门的场景版本与最终照明重叠在布局部门的场景版本中并使用照明）并将其视为场景添加一部分（例如，导入道具以开始布局）。Sub-layering 子层sublayering 将导入文件的内容覆盖在现有内容之上，每棵树关于具有相同路径的prims和具有相同名称的属性、元数据的opinions将基于opinion strength合并。当合并每个文件都应构成整个场景一部分时，此功能很有用。例如，组成代表场景布局，道具，角色，特效，灯光的单独图层。sublayering 的固有特征是“一切都仪在同一位置”。prims在新文件中的路径与其在源文件中的路径相同。因为这些部门中的每个部门都在单独的子层中工作，所以他们不必担心共享单个文件和进行冲突的编辑。但是，因为它们都在同一场景图层次结构中工作，所以每个部门可以将更改应用于其他部门创建的任何内容。Houdini中Sublayer LOP节点加载新的子层到场景中。LOP网络通常总是在空根层的最强子层。一些LOP节点可能会启动一个新的更强子层，然后再由所有后续LOP节点对其进行修改。这些网络输出的是此子层堆栈的组成。Referencing 引用Referencing将被Referencing文件并“移植”到当前树中的分支上。Referencing有且于将较小的单个资产移植到较大的场景中。特别地，引用是在不同位置多次加载同一图层文件的唯一方法。（因为子分层适用于整个树，所以多次对同一文件进行子分层将无效。）简单的垃圾桶资产#usda 1.0 ( defaultPrim = "TrashCan" ) def Xform "TrashCan" ( kind = "component" ) { def Cylinder "Can" { token axis = "Y" bool doubleSided = 0 double height = 2 double radius = 1 } }一组中3个不同房间的引用垃圾桶的文件有3次资产#usda 1.0 () def Xform "Scene" { def Xform "Set" { def "BathroomTrashCan" ( append references = @./trashcan.usda@ ) { double3 xformOp:translate = (2, 0, 1.4) uniform token[] xformOpOrder = ["xformOp:translate"] } def "KitchenTrashCan" ( append references = @./trashcan.usda@ ) { double3 xformOp:translate = (16.01, 5, -43.072) uniform token[] xformOpOrder = ["xformOp:translate"] } def "OfficeTrashCan" ( append references = @./trashcan.usda@ ) { double3 xformOp:translate = (-7.12, 0, 11.9) uniform token[] xformOpOrder = ["xformOp:translate"] } } }Houidni的Reference LOP和Stage Manager LOP创建references。 Graft LOP是相似的，但不是从一个文件引用，它插入一个分支到场景图树从LOP网络的其他地方。Houdini跟踪多个层次的子层和引用如何协同工作以在单个场景图位置生成关于图元的最终意见可能会变得很复杂。你可以使用Scene Graph Details pane面板的Layer Stack和Composition选项卡来检查哪些层构成了primitive，以及如何将这些不同的层组合在一起。Payloads 有效载荷有效负载本质上是一个references，但是有可能让USD不加载有效负载，除非特别要求它们。这使您可以控制场景的哪些部分被加载到内存中，从而通过集中精力关注场景的各个部分来减少内存使用和处理时间。在Houdini中，您可以在references文件的节点的参数中指定references的文件是纯引用还是有效负载。默认情况下，Houdini加载所有有效负载（因此它们的行为与引用完全相同）。但是，场景图树中的Configure Stage LOP和Load Masks控件允许您禁用默认的有效负载加载，然后选择要加载的特定有效负载。Activation and visibility 激活和可见性由于USD是专为非破坏性编辑而设计的，因此不允许deleting( 删除) primitives。但是，您可以使用新值override(覆盖 ) primitives，或者deactivate(停用 ) primitives，以使它们不起作用。您还可以编辑场景中对象的visibility可见性。默认情况下，USD prims是可见的。可见性选项只有两个设置：“inherit继承”和“invisible不可见”。因此，将prim 标记标记为“不invisible”也会使其所有后代也不可见。在Houdini中，您可以在Scene Graph Tree面板中以交互方式在激活和不激活以及可见/不可见之间切换图元，以允许您查看图元的效果。Houdini在内存中未保存的图层中执行这些编辑，因此它们不会影响最终生成的USD。Opinion strength Opinion 强度属性根据“strongest wins”规则进行解析，因此任何给定属性的所有值都将从最强的PrimSpec中获取。例如，具有默认值的“弱层”将被具有动画的更强层掩盖。例如，layout部门在场景中放置了一个道具，然后动画部门添加了一个动画该道具的图层。决定意见强度的最常见方法是图层堆栈的顺序。例如，最薄弱的一层可能是layout层，在这里资产被合并和定位。下一层可以将动画部门的角色添加到场景中（如果有必要，可以通过对某些现有图元应用更强的opinions，动画部门可以移动或调整layout）。然后，FX部门可能要向场景图添加新的几何图形，或将RBD模拟应用于layout或动画部门添加的某些现有primitives。Default primitive 默认primitive作为其metadata的一部分，每一层都可以指定“默认primitive”。如果您在文件中进行referenc，但未明确指定要附加的文件中的根级别的prim ，则将引用该prim 。您可以使用Configure Layer LOP为图层指定默认primitive（以及其他图层级metadata）。当您写出USD文件时，USD render node具有用于设置“顶层”图层文件的默认prim的参数。该USD render node有一个选项（Error Saving Layer With No Default Primitive）如果您还没有指定一个默认的primitive的所有层的被写到导致错误。
什么是场景装配？简单来说就是将收集的物体，材质，灯光，动画及FX和相机等组合在一起，并给制定渲染规则，进行渲染并将其发送给合成团队。也就是说，场景装配不是一个传统的DCC工具，我们可以在这个工具中使用其它DCC已创建的内容。我们将在场景装配工具中执行的主要任务分为 外观开发 照明 渲染 有时也执行其它任务例如 场景布局 布景 预合成 场景装配的功能必须是“程序性”的而不是“破坏性”的。根据需求创建不同的外观和照明。可以随时更新场景中的任何内容，例如灯光，角色，FX，相机等。所有的更新工作都将自动更新完成，我们无需再重新分配或者重新建立渲染流程及设置。这里包括着色器分配，渲染属性设置等，可以根据顺序定义它们，并且在其它物体中重复使用，而无需重复创建。如果具有相同需求的镜头，完全可以共享流程，或者说我们将创建出模板，并给不同的镜头套用，这使我们能够根据Lookdev任务来标准化我们在每个镜头的设置。如果将外观开发和照明的任务与常规3D软件进行比较，除了上面提到的部分还有更多，例如所谓的“按需处理”。不同的过程只会在我们需要它们发生的时间和地点发生。首先，场景装配能够加载不重要的数据，这在当今的高端项目中都非常常见。想象一个拥有数百个资产，数百个灯光，数千个纹理等的未来城市。如果不开发复杂的工具，几乎不可能在传统DCC软件中进行工作。在场景装配工具中能够做到这一点，除其他因素外，这要归功于数据可以存在于脚本中，但并不需要始终调用它们。由于这些“按需”过程，我们可以在视口和渲染中使用或不使用场景的任何部分，而无需通过，覆盖等。根据需求，我们总是可以通过一套保持不变的主模板来告诉渲染器我们需要什么。由于有了这个工作系统，管理复杂的场景变得非常容易和快捷。按照某些组织，脚本等模式，我们可以组织汇编脚本，以便场景元素的任何更新都是自动更新，在许多情况下，甚至不需要打开软件即可获取新的版本。所有这些都归功于属性的程序系统和着色器分配系统。始终以简化的方式并遵循规则。场景装配还允许你创建参考和发布系统，这有助于不同艺术家和Leader之间在同一项目中并行工作。谁使用场景装配？大部分VFX公司或动画公司，尤其大型公司都有场景装配的流程。大型视效或动画公司往往内部会采用单独的软件或工具来完成场景装配，因为他们将面对更为复杂的场景及更大量的镜头。对于小型工作室或者自由艺术家场景装配是否有用？毫无疑问这取决于项目类型，公司的环境和项目周期等。有时可能使用场景装配程序会如同大炮打蚊子一样，但是从长远来看，即使对于少于10人的团队，基于模板规则的场景装配的pipeline好处也是显而易见的。市面上有哪些场景装配软件工具？除了各别大型公司内部有自己的装配工具外，目前市面上也有几款非常成熟的软件。Foundry Katana典型的场景装配软件。由Sony Pictures Imageworks开发多年，现在由Foundry销售和开发。Sony，Weta，ILM，MPC等大型公司都有使用使用Katana。Katana不是最容易使用的，但也不是很复杂。只需接受入门培训，就可以很快上手。多年来，Katana的viewport已得到很大改进，现在可以进行PBR可视化，预览体积等。对于复杂的场景，它会变得缓慢而不稳定，但是现实是，没有人关心视口显示，重要的是良好的场景管理，并且面对渲染时它会快速响应。视口显示至少在VFX中是次要的。场景的导航在Katana中非常好，与Nuke几乎一样，快速，有效。Katana还通过3Delight提供了从Renderman到Arnold的不同渲染选项，现在默认情况下也已安装了3Delight，可以免费使用该渲染器。可以说Katana是市面上最专业的场景装配工具。并且Katana可以给任何高端VFX工作室提供完善的LookDev Pipeline。唯一的问题是它非常昂贵。Isotropix ClarisseClarisse是行业中另一个广泛使用的场景组装程序，其中Double Negative是其最大的客户。ILM，Tippet Studios，ILP等也曾使用。Clarisse最擅长的是它的场景布局工具。Clarisse的散布和实例化系统很棒。使用极其简单，非常快捷，最重要的是有效。Clarisse的学习非常简单，比其它场景装配工具要简单得多，这使得小型团队或个人的生产率更高。到目前为止，Clarisse的viewport是最好的，即使在巨大而复杂的场景中，也可以实时显示阴影和照明。另一方面，导航不如Katana那样好，因为它基于“上下文”或文件夹的层级关系。它还允许您创建渲染属性，规则，层次结构等，但显示方式不如节点的易读且更不舒服。不过这将随着新的Clarisse Builder的发布而改变。Clarisse最糟糕的是，它只能使用自己的渲染器工作。虽然它自身的渲染器并不太差，但这也意味着你必须放弃之前所熟悉的渲染器，并且不利于其它平台使用，因为Clarisse的渲染器目前并没有针对其它软件发布过接口或者插件。好在Clarisse的售价远低于Katana的价格。HoudiniHoudini不是专用的场景装配程序，但是由于Houdini是一种程序化工具，因此你当然可以作为场景装配工具来使用。但它既不像Katana或Clarisse那样舒适，也不容易使用，而且可能也不像Katana或Clarisse那样好用。同样有大量VFX工作室使用Houdini来负责外观设计，照明和渲染任务。Houdini的视口不好说，尤其是使用第三方渲染器时，但它绝对可以接受。Houdini还允许你使用包含许多资产FX等的非常复杂的场景。并且仅在渲染时调用必要的内容。在这方面，它不如Katana高效，但它比任何其它DCC都要好得多。至于渲染器选项，Houdini附带了Mantra，这是很接近于Renderman的渲染器，虽然渲染速度可能不如其它主流渲染器快，但某些任务例如渲染体积会高效许多，但一般来说，它不如Arnold或Renderman 。Houdini还有其它渲染器可选择，例如Arnold，Renderman，V-ray，Redshift等。Houdini可以用来生成点云，散布物体实例，数字资产等，因此可以考虑将Houdini用作Katana或Clarisse的替代品，尽管这些功能无法充分发挥第三方渲染器的潜力，但第三方渲染器也在加紧改进以便支持更多Houdini的节点及属性。Houdini还具有2D合成模块，可以实现简单的合成或用于调整修改贴图使用。在场景管理方面，Houdini比在其他DCC中要好得多，但目前还不如Katana的节点系统或潜在的新Clarisse Builder，不过下一个Houidni的版本将会添加全新的模块Solaris，它是专门针对于场景配置及Lookdev和渲染模块，将会采用全新的渲染器，并且大大改善了视口显示性能。GafferGaffer可以说是简化版的Katana。但它同样可以完成非常复杂的场景任务。Gaffer是在Image Engine内部开发的场景装配工具，已经被使用多年。此外，Gaffer是开源且免费的， 这使它具有非常低廉的使用成本。Gaffer使用起来非常简单，并且目前支持Appleseed，Arnold或3Delight等不同的渲染器，将来还会移植其他引擎。它的场景管理做的非常出色，至少与Katana处于同一级别，但是Gaffer更简洁。viewport是它的弱项，但对于VFX行业来说，面对可怕的场景，视口显示在某些方面是次要的。在Gaffer中，你可以使用实例化系统，创建点云等。尽管技术不如Clarisse那样方便呈现给使用者，但仍然存在该技术。John Haddon和Image Engine免费提供Gaffer，但是Image Engine或Cinesite中使用的并不完全相同。就场景装配工具而言，或许还有其它许多方案，可能是非常小众的工具，也可能是我们无法见到的工具，或许有一天你在某家大型公司可能会见到它们。最后说一说Maya，作为VFX行业中的标准DCC，尽管它不是专门的场景装配工具，但它也提供了类似的功能，尤其在最近的版本中添加了某些功能非常方便于处理大型场景。例如alembic gpu高速缓存，它可以在单个场景中提供更大的资产负载。当然，在处理复杂计划的修整时，使用Arnold的ass文件进行场景布局也非常有用。
不得不说Clarisse像一条破船，在不断打着补丁，从更新版本的速度以及每次更新的内容就能发现，每次修复的bug都是非常致命的错误！Clarisse官方论坛部分专门建立了Bug Tracker分支，用于收集用户的bug。说白了就是拿用户当小白鼠，帮助开发人员测试，这也是制定新版本的路线图重要组成部分。最近公司项目需要，经常需要将Clarisse的场景提交到某渲染农场去渲染。因为最近4.0的发布，所以公司也基本都更新了新版本的4.0 SP1用于项目制作。新版本对于3.6的支持有些问题，尤其关于abc文件的加载问题上，不过还是可以人工修正回来。所以用4.0 SP1去渲染并没有发现什么不对。但最近在农场上提交4.0的文件时，发现渲染速度成倍的变慢，检查文件后又没有发现问题，我用前台渲染检查了渲染时间，感觉问题肯定出在农场那边，我把问题反应给了农场，他们的TD检查后发现，原来使用cnode渲染文件时，虽然在命令上只写了渲染其中的一层，但是cnode在执行命令时将所有层全部渲染了一次，并且只保存了cmd命令中指定的那一层的输出文件！这都不能用坑爹来形容了。Clarisse和maya类似，渲染也是分前台和后台执行，执行的程序及命令都不一样，前台是通过Clarisse程序来执行渲染，而农场渲染必定是采用后台渲染的方式，这就要使用cnode程序来执行渲染（也可以使用crender，但是官方不太建议使用crender，并且在4.0中已经去掉crender程序），使用cnode渲染需要执行固定的一条渲染命令，这个帮助文档上说的很明白。这个命令里是需要指定image及image下的layer，以告诉渲染器渲染哪一层的内容。但是4.0 SP1坑爹的将没有写在命令中的层一起渲染了，只要指定了image，就会将image下的所有层全部渲染，并且只保存命令中指定的层。为了验证这个问题。我弄了个简单的场景，在image下建立两个3D Layer，两个层分别设置输出不同路径先使用4.0 SP1进行命令行渲染："C:\Program Files\Isotropix\Clarisse iFX 4.0 SP1\Clarisse\cnode.exe" H:\clar_rendertest\clar_test_v001.project -image scene/image.layer_a -stats -frame 1 5 -output H:/clar_rendertest/clar_test_v001/layer_a.####.exr果然显示的信息是先执行了layer_b的渲染，直到layer_b进度达到100%才开始渲染layer_a，layer_a达到100%后对layer_a进行保存exr：接着使用3.6 SP8b进行命令行渲染："C:\Program Files\Isotropix\Clarisse iFX 4.0 SP1\Clarisse\cnode.exe" H:\clar_rendertest\clar_test_v002.project -image scene/image.layer_a -stats -frame 1 5 -output H:/clar_rendertest/clar_test_v002/layer_a.####.exr渲染器直接就对layer_a进行渲染，完成后分别对5帧进行保存操作： Clarisse iFX 4.0 SP1的后台渲染BUG无疑。 后来又到官方论坛上找了找，果然在今年4月份时，Bug Tracke上已经有人提交了这个bug，解决方案就是保证每个image里只含有一个layer。。。 ![](https://aduvfx-1252404142.cos.ap-beijing.myqcloud.com/uploads/2019/07/bcf13bd3356e32f8f7b17d181f4623bd_8d1d849a-0997-4eb2-938e-b2f54ade3883.png) ![](https://aduvfx-1252404142.cos.ap-beijing.myqcloud.com/uploads/2019/07/bcf13bd3356e32f8f7b17d181f4623bd_4505c4b2-6fd3-4f2b-a723-ce7013314cd6.png) 这个BUG编号#9676 不过好在SP3版本的更新中，已经提到修复了#9676的BUG！ ![](https://aduvfx-1252404142.cos.ap-beijing.myqcloud.com/uploads/2019/07/bcf13bd3356e32f8f7b17d181f4623bd_193f28f6-7b84-4df2-b9f8-91c43e90e2b6.png) > 下周一公司将对Clarisse进行新一轮的更新了！
伊利扬 · 格奥尔基耶夫、杰米 · 朴茨茅斯、扎普 · 安德森、阿德里安 · 赫鲁贝尔、艾伦 · 金、大垣慎司、弗雷德里克 · 斯文特版本 1.0.1.1本文档是 uber 表面着色器的规范，旨在提供一种材质表示，能够对实际视觉效果和动画制作中使用的绝大多数材质进行准确建模。它遵循 Arnold 渲染器中标准曲面着色器的设计，其实现相对简单，其用户界面由一小组具有直观含义和范围的参数组成。本文档是版本化的，将随着规范的发展而更新。我们提供 OSL 和 MaterialX 参考实现 [Georgiev2019 ]，其目的是指定足够的细节，以允许在其他渲染器中实现，根据目的将外观与合理的保真度相匹配。今天，不同设施之间计算机图形场景资产的交换仍然是一个重大问题，尤其是在表面外观方面。不同的渲染器和 3D 引擎使用不同的着色系统、着色语言和固定功能的管道。此外，准确地建模表面外观仍然是一个复杂而相关的问题，并且是一个活跃的科学研究主题。然而，_当今_行业迫切需要找到一种标准化的材料模型，既涵盖日常工作流程中的最常见用例，又易于使用。多年来，随着不同供应商达成共识，将材料定义与场景中的光传输模拟分开，某些事实上的标准外观定义框架已经出现。此类通用框架包括 MaterialX、材质定义语言 (MDL) 和开放着色语言 (OSL) [Gritz2010]，允许将材料指定为原始表面反射模型的组合。然而，这些框架本身不足以满足最终用户的外观开发，他们不应该为日常任务从头开始构建表面着色器。需要具有一组明确定义的参数的标准超级着色器参数化，这些参数可以进行调整以表示大多数真实世界（以及想象中的）材质。在本提案中，我们旨在填补这一空白；我们的参考实现之一是用 OSL [Georgiev2019 ]编写的。我们提出的模型紧跟 Arnold 5 标准曲面着色器，它在 Anders Langlands 的 alSurface [Langlands2014 ] 和 Autodesk 3ds Max 的 Physical Material [Andersson2016 ] 中具有强大的精神前辈。alSurface 着色器在一段时间内已成为业界事实上的标准，但不再积极开发。3ds Max 的物理材质又受到 Allegorithmic 的 PBR 着色模型 [McDermott2018 ]、迪斯尼的 Principled Shader [Burley2012 ] 和几个实时 3D 引擎的一般行业趋势的强烈启发，并且在所有主要渲染引擎的支持下都得到了生产证明用于 3ds Max。在这个提议中，我们没有为每个可能的情况提供参数，而是有意尝试将参数集归结为仅在实践中最有用的参数。我们还修复了原始反射模型的组合，以确保用户尽可能在物理上合理的范围内工作。我们的目标是使整体行为简单、合乎逻辑、直观且易于理解，以便该模型涵盖大多数日常用例。对于它没有涵盖的少数几个，可能需要使用特定于渲染器的着色器，或构建定制的着色网络。我们的目标是创建一个表面着色模型，能够忠实地代表各种现实世界的材料。金属、玻璃或墙漆等基本材料表面的光散射特性得到了很好的研究，可以通过简单的分析模型准确地表示出来。其他材料，例如成品木材、布料或皮肤，包括堆叠在彼此顶部的半透明物质层。此类材料更复杂的行为是光在这些层之间的界面处散射并通过它们传播的结果，并且每个此类散射界面通常可以由分析模型表示。此外，许多现实世界的物体由几种不同的材料制成，例如金属和塑料，通过在其表面上对每种材料的类型进行纹理化，可以方便地对此类对象的外观进行建模。虽然材料过渡通常是突然的，但连续混合材料的能力对于艺术目的以及抗锯齿都很有用。两个基本操作——分层和混合——提供了一种语言来对具有复杂外观的不同材料进行建模。对于具有物理意义的堆叠层，它的底部应该有一个不透明（例如金属）或透明（例如玻璃或皮肤）的体块，并在其顶部有一组电介质板。任何未在两层之间的界面处反射的光都会向下传输通过下层，并在其相应的介质内进行选择性吸收。混合操作可以被认为是两种材料的统计混合，即使并非所有组合都具有物理意义。作为线性插值，该操作自动保持能量守恒。我们的着色器对包含十个组件的材质进行建模，这些组件按层次分层和混合，如图 1 所示。单个组件的属性可以在整个表面上变化。图 1：我们的着色器模拟的理想化材质模型的示意图。组件的水平堆叠代表统计混合，垂直堆叠代表分层。标有星号的组件是可选的，如第2.2节所述 。闭合混合表示给定一个着色点和一个视图方向，我们着色器的评估结果是一个_双向散射分布函数_(BSDF)，它描述了表面在那个点和方向上的光散射特性（加上一个发射分量和一个次表面散射分布1） . 由于在材料的整个结构内传播和散射，因此产生的 BSDF 表示在最顶部界面处的聚集光散射行为。准确模拟层状材料内的光传播通常很困难且计算成本很高，并且仍然是一个活跃的研究课题。我们的着色器采用常见的实用方法，即生成的 BSDF 可以表示为“原子”、构建块 BSDF 的简单混合（即线性组合）——图 1 中的每个组件一个。我们仍然尝试通过调整原子 BSDF 的属性和线性组合权重来模拟分层最重要的物理效果——着色、反射/透射模糊和角度相关的图层透明度。每个原子 BSDF，通常非正式地称为“波瓣”，是反射或传输分布函数，即 BRDF 或 BTDF（发射和次表面散射除外）。在我们的实现中，这些 BSDF 由_闭包_表示。闭包是一个“黑盒”对象，它包含用于评估和采样底层 BSDF 2 的渲染器特定例程。它由渲染器定义和使用，但由着色器使用一组基本数据类型的参数（例如浮点数、向量和颜色）进行_实例化_。我们的着色器返回一个闭包对象列表，每个对象都有一个关联的（颜色）权重。用户可以通过一组着色器级参数来控制闭包的实例化参数和权重，以模拟各种物理上合理的材料。加权闭包的总和完全描述了给定表面点的光发射和散射特性。封闭列表，如表 1所示，最终被传递给渲染器，用于集成围绕着色点的光传输。成分关闭描述透明度transparency简单的传递（可以认为是增量 BTDF）涂层specular_brdf介电微面 BRDF (GGX)排放emission漫射金属metal_brdf导体微面 BRDF (GGX)镜面反射specular_brdf介电微面 BRDF (GGX)镜面透射*specular_btdf介电微面 BTDF (GGX)光泽*sheen_brdf逆反射介电微面 BRDF [ Estevez2017 ]次表面散射*subsurface次表面散射（例如扩散或随机游走）漫透射*diffuse_btdf漫反射微面 BTDF (Oren-Nayar)漫反射diffuse_brdf漫反射微面 BRDF (Oren-Nayar)表 1：代表图 1所示材料模型的每个组件的闭包列表。标有星号的闭包是可选的，如第2.2节所述 。闭合权重通过一个公式计算，该公式旨在满足构造能量守恒，同时近似模拟层间光传播的影响。可以说，最突出的这种效果是镜面（电介质）层的方向变化透明度，这是它们的菲涅耳控制的半球方向反射率（又名定向反照率）的结果。我们根据反射率对对应的 BRDF 闭包与底层闭包进行权衡，我们的实现假设有一个reflectance(brdf)函数可以计算它。当反射积分的解析表达式不可用于闭包时，可以对其进行近似，例如通过蒙特卡罗估计。我们着色器的闭包权重计算逻辑最容易被可视化为一棵树，其中每个叶节点都是一个闭包，每个内部节点都是其两个子节点的线性组合，在边缘指定权重。我们在图 2 中说明了这种树结构。每个闭包的最终权重是沿其对应叶节点和根节点之间路径的边权重的乘积。在下面的第3节 中，我们更详细地描述了各个闭包和边权重。图 2：我们的着色器返回根闭包standard_surface，它是“原子”闭包的加权和，显示为树中的叶节点。每个闭包的权重是从其对应的叶子节点到根节点的路径上边权重的乘积。边缘权重由着色器级参数参数化，以粗体显示。兼容模式我们的模型旨在使生产级应用程序相对简单，但是其闭包和参数的数量对于实时引擎来说可能太多而无法处理。对于此类应用程序，我们定义了“预览”级别的兼容性，在典型情况下将我们的着色器简化为合理的视觉相似度。简化相当于归零组合权重参数transmission，sheen以及subsurface，它有效地消除了specular_btdf，sheen_brdf，subsurface，和diffuse_btdf封闭件。在这种兼容模式下，我们也忽略了其他闭包中的某些参数，这些参数在下一节的参数表中用星号标记。在本节中，我们描述了我们的着色器使用的各个闭包，列在表 1 中，它们的参数以及它们如何相互加权。一些参数在闭包中重复使用，因此它们在下面的小节中出现多次。我们用粗体表示着色器级参数，例如opacity。透明度该transparency封闭件具有没有实例化参数，并使得表面在遮光点完全透明，即，在输入射线被发送未偏转的和未着色的。效果如图3所示。所述opacity着色器参数控制所有其他封闭件的相对重量（通过线性“阿尔法”共混物），因此透明度重量1-opacity。通过以下公式的透明度和涂层闭合的组合是产生最终standard_surface闭合组合的顶级混合物：标准表面 = (1 - 不透明度) * 透明度() + 不透明度 * 涂层层 在coat_layer下面的小节中定义了闭包。着色器参数：透明度Name类型默认描述opacity颜色1,1,1表面的（彩色）不透明度（默认情况下完全不透明）图 3：不透明度与透射率。从左到右：仅带透射的球体、（二进制）不透明蒙版、带透射和蒙板不透明度的球体。涂层最上面的散射层是带有 GGX 微面 BRDF 闭合的介电涂层coat_brdf。作为电介质，该 BRDF 不保能（即，其定向反射率通常小于 1），因为它遵循菲涅耳反射定律。该层被假定为无限薄，剩余的未反射光直接传递到下面的层而不发生折射。反射颜色固定为白色，尽管涂层介质颜色可以由用户控制。闭包组合公式为外套层=外套*外套_brdf（...）+ lerp（白色，外套_颜色*（1 - 反射（外套_brdf）），外套）*发射镜面混合 其中lerp(a, b, t) = (1 - t) * a + t * b，emission_specular_mixture闭包在以下小节中定义。在上面的闭包公式中，white表示恒定的白色。然后，涂层实际上是“无操作”直通（当coat参数变为零时）和具有嵌入吸收介质的电介质板之间的统计混合。在真实的物理材料中，被底层散射的光在穿过有色/粗糙涂层时会被着色和模糊。在渲染器中准确捕捉这些效果需要按顺序模拟各个层之间的光相互作用。由于我们的模型是独立评估的闭包的简单线性组合，我们模拟这些效果：对涂层下方的所有层进行着色是通过按coat_color参数缩放它们的闭合来实现的，这可以解释为涂层介质内的吸收效应对来自底层的反射进行着色（即能量被着色涂层吸收）。在基板顶部有介电涂层时，一小部分光在涂层内部表现出内部反射，然后返回基板再次反射，变得更暗和更饱和。这种效果可以通过coat_affect_color参数模拟，该参数用作基材颜色的指数，目前仅限于漫反射和次表面散射：base_color = pow(base_color, 1.0 + (coat *coat_affect_color)) subsurface_color = pow(subsurface_color, 1.0 + (coat *coat_affect_color)) 我们还提供了镀层粗糙的选项来增加其他GGX BSDFs，即粗糙度metal_brdf，specular_brdf和specular_btdf。其余的 BSDF 没有调制，因为它们已经很粗糙了。调制给定的公式roughness是粗糙度 = lerp（粗糙度，1，外套 *coat_affect_roughness *coat_roughness） 着色器参数：涂层Name类型默认描述coat漂浮0反射权重（反射颜色固定为白色）coat_color颜色1,1,1来自下方所有层的光线的色调颜色coat_roughness漂浮0.1涂层反射粗糙度；在传递给 BSDF 之前在内部进行平方以获得更线性的感知响应 [ Burley2012 ]coat_anisotropy*漂浮0的反射各向异性coat_brdf；范围[0,1]coat_rotation*漂浮0各向异性的取向；范围[0,1]（其中1表示 360°）coat_IOR漂浮1.5的折射率 coat_brdfcoat_normal向量0,0,0涂层反射的着色法线；可选，覆盖默认的着色法线；对闭包组合权重没有影响coat_affect_color*漂浮0额外调制漫反射和次表面散射饱和度的程度；范围[0,1]coat_affect_roughness*漂浮0对下面镜面反射层粗糙度的影响有多大；范围[0,1]图 4：通过组合涂层和镜面反射层可以实现的各种效果。从左到右：薄片、雨滴、碳纤维。排放附加的定向均匀（即朗伯）发射闭合emission位于涂层下方，但在其他方面不受应用于其他闭合的组合权重的能量守恒逻辑的影响。我们将发射置于涂层下方，以允许渲染由反射表面（例如荧光棒）界定的低发射材料，而无需对发射器和边界对象进行明确建模。涉及发射的闭包组合是发射镜面混合=发射*发射颜色*发射（）+镜面混合 其中specular_mixture闭包定义如下。着色器参数：发射Name类型默认描述emission漂浮0发射颜色乘数emission_color颜色1,1,1发光颜色图 5：表示连接到 的热熔岩的纹理贴图emission_color。金属涂层下方的金属反射被建模为 GGX 微面导体 BRDF metal_brdf，其吸收系数和复杂的折射率是根据更用户友好的参数base_color和specular_color [Gulbrandsen2014 ] 计算的，定义如下。这允许通过直接指定正常和掠射入射的（可纹理化）颜色来实现所需的外观。请注意，这两个颜色参数也用于非金属（即电介质）镜面反射和漫反射 BRDF，如下所述。这种非透射金属 BRDF 作为统计混合物与非金属（即电介质）镜面反射层模型混合，在下一节中描述，根据metalness参数如下：specular_mixture = metalness * metal_brdf(...) + (1 - metalness) * specular_reflection_layer 其中specular_reflection_layer闭包定义如下。当厚度为光波长数量级的薄折射膜放置在材料顶部时，由于干涉，会出现类似彩虹的彩虹色效应。这些效果包含在微面封闭中，适用于金属或镜面反射和透射层，以存在为准。薄膜在逻辑上位于涂层和底层之间，但由于假定涂层是无限薄的，薄膜外部介质的折射率被认为是真空的折射率，即1.0。假设它的内部是镜面反射层。薄膜模型基于 Belcour 和Barla [Belcour2017 ] 的模型。着色器参数：金属Name类型默认描述base漂浮1标量乘数 base_colorbase_color颜色0.8,0.8,0.8法向入射时的反射颜色（即从正上方看的表面）specular漂浮1标量乘数 specular_colorspecular_color颜色1,1,1掠入射时的反射颜色（即轮廓周围）specular_roughness漂浮0.2反射粗糙度；在传递给 BSDF 之前在内部进行平方，以在参数范围内实现更均匀的粗糙度外观specular_anisotropy*漂浮0的反射各向异性metal_brdf；范围[0,1]specular_rotation*漂浮0各向异性的取向；范围[0,1]（其中1表示 360°）thin_film_thickness*漂浮0薄膜厚度（纳米）thin_film_IOR*漂浮1.5薄膜的折射率图 6：通过设置base_color和specular_color参数由金属封盖生产的金属。从左到右：铝、铜、金。图 7：薄膜干涉对表面的影响。从左到右：多色调车漆、肥皂泡和烧焦的铬。镜面反射该层模拟了 GGX 微面电介质 BRDF specular_brdf，概念上就在涂层下方。与涂层类似，由于菲涅耳定律，这种 BRDF 本身不是能量守恒的，未被反射的能量完全传输到下面的层。我们使用的闭合组合表示反射和透射镜面波瓣之间的能量平衡specular_reflection_layer = specular * specular_color * specular_brdf(...) + (1 - specular_color * specular * 反射率(specular_brdf)) *transmission_sheen_mix 其中transmission_sheen_mix闭包定义如下。着色器参数：镜面反射Name类型默认描述specular漂浮1镜面反射权重specular_color颜色1,1,1镜面反射颜色specular_roughness漂浮0.2反射粗糙度；在传递给 BSDF 之前在内部进行平方，以在参数范围内获得更均匀的粗糙度specular_IOR漂浮1.5的折射率 specular_brdfspecular_anisotropy*漂浮0的反射各向异性specular_brdf；范围[0,1]specular_rotation*漂浮0各向异性的取向；范围[0,1]（1表示 360°）thin_film_thickness*漂浮0薄膜厚度（纳米）thin_film_IOR*漂浮1.5薄膜的折射率图 8：改变镜面反射折射率。从左到右：1.0、1.1、1.52（默认）。镜面透射该层transmission对通过 GGX 微面 BTDF 穿过镜面反射层底部的透射specular_btdf或从漫反射基层 ( base_layer) 散射的统计混合（根据参数）进行建模。闭包组合由下式给出transmission_sheen_mix = 透射 * transm_color * specular_btdf(...) + (1 - 透射) * sheen_layer 在sheen_layer下面的小节中定义了闭包，并且如下所述，transm_color = (transmission_depth == 0) ? 传输颜色：1 传输闭包specular_btdf与 共享许多参数specular_brdf；例如，粗糙度​spec_btdf​默认与 相同specular_roughness。它可以通过​transmission_extra_roughness参数额外增加或减少，尽管这在物理上是不正确的。就像镜面反射 BRDF 一样，这个 BTDF 可以通过重用相同的参数由薄膜调制。如果thin_walled布尔参数为false，则表面被认为是有限尺寸实体对象的边界。因此，根据specular_btdf闭合，光在进入和离开物体时会发生折射。如果thin_walled是true，则表面是双面的，代表无限薄的壳（例如理想化的树叶或纸），因此光在镜面透射到另一侧时不会发生折射。在这种情况下，折射率设置为周围介质的折射率（例如，真空为 1.0），并且色散和薄膜被禁用。我们还允许指定对象内部均匀介质的属性，有或没有散射。这对于建模一系列材料非常有用，从透明或有色（仅吸收）玻璃和液体到具有视觉显着散射的材料，例如蜂蜜、深水体、乳白色玻璃或乳白色玻璃。的transmission_color和transmission_depth参数对是一种常用的艺术家友好的方式来设置的介质的消光系数，而transmission_scatter直接设置介质的散射系数。当transmission_depth为零时，内部介质为零，并transmission_color用于直接在闭合混合物中以恒定量乘法着色折射（参见上面的代码片段）。什么时候transmission_depth 为正，着色由内部介质通过比尔定律控制。着色器参数：镜面透射Name类型默认描述transmission*漂浮0传动重量transmission_color*颜色1,1,1透射颜色，即色调transmission_depth*漂浮0白光在材料transmission_color内部传播的距离，直到它的颜色完全符合比尔定律，决定了内部介质的消光系数；如果为零，则transmission_color作为恒定（表面）透射色调；范围[0,infinity)transmission_scatter*颜色0,0,0内部介质的散射系数transmission_scatter_anisotropy*漂浮0内部介质的 Henyey-Greenstein 相函数的各向异性；范围[-1,1]transmission_dispersion*漂浮0色散阿贝数，描述折射率随波长变化的程度​transmission_extra_roughness*漂浮0附加（正或负）粗糙度 specular_roughnessspecular_roughness漂浮0.2折射粗糙度specular_btdf; 在传递给 BTDF 之前在内部进行平方，以在参数范围内实现更均匀的粗糙度外观[0,1]specular_IOR漂浮1.5的折射率 specular_btdfspecular_anisotropy*漂浮0的反射各向异性specular_btdf；范围[0,1]specular_rotation*漂浮0各向异性的取向；范围[0,1]（其中1表示 360°）thin_film_thickness*漂浮0薄膜厚度thin_film_IOR*漂浮1.5薄膜的折射率thin_walled*布尔值false如果true，物体被认为是无限薄的并且表面是双面的图 9：的效果transmission_scatter_anisotropy。从左到右：-0.5、0.0、0.5。光泽所述sheen_brdf封闭件是基于该埃斯特韦斯和库拉 的微面光泽 BRDF [Estevez2017 ]。它模拟纺织品的外观，其中表面刻面是圆柱形 “纤维”，轴主要平行于表面法线，在掠射角产生镜面高光。从概念上讲，这位于基础基板的顶部，因此传输到基板的能量会因光泽反射率而减少：sheen_layer = sheen * sheen_color * sheen_brdf(...) + (1 - sheen *reflectance(sheen_brdf)) * base_mix 其中base_mix闭包定义如下。着色器参数：sheenName类型默认描述sheen*漂浮0.8反射权重 sheen_brdfsheen_color*颜色1,1,1的反射颜色 sheen_brdfsheen_roughness*漂浮0.3反射粗糙度sheen_brdf；范围[0,1]图 10：使用光泽闭合呈现的各种纺织品。漫反射根据subsurface参数，基础衬底层由 Oren-Nayar 漫反射分量和次表面分量的统计混合组成：base_mix = (1 - subsurface) * base * base_color *diffuse_brdf(...) + subsurface * subsurface_mix 其中subsurface_mix闭包定义如下。着色器参数：漫反射Name类型默认描述base漂浮0.8反射权重 diffuse_brdfbase_color颜色1,1,1的反射颜色 diffuse_brdfdiffuse_roughness*漂浮0反射粗糙度 diffuse_brdf漫透射如果thin_walled是 ，则次表面分量退化为漫透射true。这代表了一个无限薄的外壳（例如一张理想化的粗糙纸），能量通过它传输到漫射瓣中。漫反射通过 Oren-Nayar 微面 BRDF 建模，围绕着色法线翻转，使其成为 BTDF：subsurface_mix = Thin_walled * subsurface_color *diffuse_btdf(...) + (1 - thin_walled) * subsurface(...) 其中subsurface封闭件进行说明。着色器参数：漫反射Name类型默认描述subsurface*漂浮0漫反射权重subsurface_color*颜色1,1,1漫透射色diffuse_roughness*漂浮0漫透射粗糙度图 11：不透明纸平面（左）与通过thin_walled（右）启用的漫反射。次表面散射对于固体对象（其thin_walled是false），表面散射模型的光传播和扩散的表面下的效果，其中，通常离开的射线叶在比入射光线不同的表面位置。这种效果由subsurface闭包表示，对此我们没有规定要使用的特定渲染模型，例如基于漫射轮廓表面照明模糊或强力次表面光线追踪。着色器参数：次表面散射Name类型默认描述subsurface*漂浮0次表面散射权重subsurface_color*颜色1,1,1次表面颜色，由subsurface(...)闭包使用subsurface_radius*颜色1,1,1红色、绿色和蓝色通道的次表面半径（即平均自由程）subsurface_scale*漂浮1标量标度 subsurface_radiussubsurface_anisotropy*漂浮0地下介质相函数的各向异性；范围[-1,1]图 12：改变次表面散射半径的效果 ( subsurface_radius)。在介绍了我们提出的模型之后，在本节中，我们将讨论一些潜在的微妙之处、注意事项和未来改进的领域。标量与 RGB 闭包权重考虑我们的镜面反射层公式，其中我们有闭包组合：specular_reflection_layer = specular * specular_color * specular_brdf(...) + (1 - specular_color * specular * 反射率(specular_brdf)) *transmission_sheen_mix 这里包括了specular_color因子乘法reflectance(specular_brdf)以确保能量_保存_。例如，如果反射是纯红色，则只有互补的青色会透射到底层。这允许防止组合模型中的能量损失并创建具有高反照率的多层材料。但是，虽然它在物理上是正确的，但它也可能使艺术家更难控制底层裂片中互补色的外观。我们考虑的另一种方法（例如在 3ds Max 的物理材料模型中使用）是将乘法闭合因子保持为标量，例如在这种情况下specular_color将从闭合权重中省略。这在技术上违反了能量守恒（即能量以非物理方式消散）并且难以创建具有彩色镜面反射的高反照率材料。但是，这种行为对艺术家来说可能更直观。总的来说，我们更喜欢身体上正确的行为，但这是有争议的。互惠物理上正确的 BSDF 必须满足互易性（即传入和传出方向交换下的对称性）。然而，在我们提出的模型中，即使叶级 BSDF 是互易的，闭包组合_也不是_。这是由于引入了reflectance(...)仅取决于传入方向的函数。如果将着色模型合并到某些光传输算法（例如双向路径跟踪）中，则这可能会出现问题，这些算法通常依赖此属性来保持。然而，强制互惠可能会使我们模型的数学形式显着复杂化，而不会产生质量上更好的视觉外观。对于许多渲染器，包括 Arnold——一种单向路径追踪器，可以违反互易的物理约束，即使在叶 BSDF 中，也不会导致任何实际问题。此外，以真正物理上正确的方式 [Jakob2014 ] 强制实施分层材料的互惠性目前过于复杂和繁琐，无法在生产渲染器中实现。在实际生产使用中实现互惠的模型，例如 Kulla 和 Estevez [Kulla2017 ] 的涂层方案，通过引入可能类似于此处描述的非互惠方法的不准确度的极端近似来实现。因此，目前我们并不认为在我们的模型中加入互惠是绝对必要的。分层模型我们的分层模型通过施工确保节能，并尽可能确保节能。然而，作为一个相对简单的模型，它只是根据近似reflectance(...)函数调整权重的闭包的线性组合，它不是我们描述的层中光传输的物理精确模拟。最近出现了许多对分层介质中全光传输的更准确处理 [Jakob2014 ] [Belcour2018 ] [Zeltner2018 ]。这些模型结合了通过整个层堆叠的各种反射和传输模式的影响，从而生成了最终的 BSDF（或一般的 BSSRDF），它不是每层 BSDF 的简单线性组合。将来，我们希望研究过渡到更准确的模型，例如这样。然而，目前似乎所有可用模型的计算成本都更高，实现起来也更复杂。我们至少在我们的模型中尝试合并一些由于手动层间交互而产生的最重要的影响。例如，我们允许涂层的粗糙度影响（部分）底层的粗糙度。表面取向在透射情况下，光可能从表面法线的上方或下方入射。传输层对此很敏感，并确保光线正确地折射通过界面。但是，其他层的方向与_面向_法线方向一致，因此当对象从外部和内部受到撞击时，散射行为是相同的。这又是一种非物理近似，它在实践中很有用，因为它简化了逻辑而不会引入明显的视觉伪影。用户友好性与灵活性我们的模型目前具有固定数量的层，其中仅包括两个镜面反射层，而其他一些流行模型（例如，皮克斯的 PxrSurface [Hery2017 ]）允许更多可配置的层数。在生产环境中，这种将模型调整到精细程度的自由在某些情况下可能很有用。然而，正如前面提到的，我们这里的一般理念是，最好提供一组相对最小的具有直观意义的用户友好参数，并使用组合方案确保任何给定的参数集都在物理合理性的范围内。在模型无法产生所需结果的边缘情况下，可以编写自定义着色器图。在本文档中，我们描述了一个标准、通用表面着色器的提案，用于各种生产渲染环境。此模型基于 Arnold 渲染器中标准曲面着色器的当前实现。我们详细描述了构成模型的十个闭包，以及它们如何组合以生成最终着色器。我们希望这个提议可以作为更广泛采用的标准表面着色器实现的有用基础。作者要感谢 Mike Farnsworth、Lee Griggs、Arvid Schneider、Milos Hasan、Michael Nickelsky、Henrik Edstrom、Karl Schmidt、Niklas Harrysson、Marcel Reinhard 和 Davide Pesare 提供的有用意见和反馈。[ Andersson2016 ] Zap Andersson。2016. 物理材料 (v1.01)。欧特克白皮书。[ Belcour2017 ] Laurent Belcour 和 Pascal Barla。2017. 微面理论的实际扩展，用于建模不同的虹彩。_ACM 图形交易_, 36, 4.[ Belcour2018 ] Laurent Belcour。2018. 使用带有统计运算符的原子分解高效渲染分层材料。_ACM 图形交易_, 37, 4.[ Burley2012 ] 布伦特 · 伯利。2016. 迪士尼基于物理的着色。在 _ACM SIGGRAPH 2012 课程：电影和游戏制作中基于物理的实用阴影_。[ Estevez2017 ] Alejandro Conty Estevez 和 Christopher Kulla。2017. 生产友好的 Microfacet Sheen BRDF。Sony Pictures Imageworks 技术报告。[ Gritz2010 ] 拉里 · 格里茨、克利福德 · 斯坦、克里斯 · 库拉和亚历杭德罗 · 康蒂。2010. 开放着色语言。在 _ACM SIGGRAPH 2010 会谈中_。[ Gulbrandsen2014 ] Ole Gulbrandsen。2014. 艺术家友好金属菲涅耳。_计算机图形技术杂志_，3、4。[ Hery2017 ] Christophe Hery, Ryusuke Villemin, Junyi Ling. 2017. 皮克斯材料基金会。皮克斯技术报告。[ Jakob2014 ] Wenzel Jakob、Eugene d'Eon、Otto Jakob 和 Steve Marschner。2014. 渲染分层材料的综合框架。_ACM 图形交易_, 33, 4.[ Langlands2014 ] 安德斯 · 朗兰兹。2014. Arnold 中基于物理的着色器设计。在 _ACM SIGGRAPH 2014 会谈中_。[ Kulla2017 ] Christopher Kulla 和 Alejandro Conty Estevez。2017. 在 Imageworks 重新审视基于物理的着色。在 _ACM SIGGRAPH 2017 课程：理论和实践中基于物理的阴影_。[ Zeltner2018 ] Tizian Zeltner 和 Wenzel Jakob。2018. 层实验室：各向异性表面反射率的加法和减法组合的微积分。_ACM 图形交易_, 37, 4.1 为方便起见，允许我们的闭包列表不仅是严格的 BSDF，而且还包括发射分布函数 (EDF) 和双向次表面散射分布函数 (BSSRDF)，这很有用。渲染器被理解为识别这些并适当地处理它们。2 或者确实是 EDF 或 BSSRDF。
software:MayaArnoldVrayNukeWorld Creator