Adu Blog - render
type: channel
link: https://www.aducg.com/tag/render/
items: Katana批量镜头生产（一）
items: 关于Katana Arnold输出MotionVector
items: Houdini Arnold自定义Cryptomatte
items: Houdini Solaris USD基础概念（一）
items: 关于场景装配
items: Clarisse iFX 4.0 SP1坑爹BUG
items: Autodesk Standard Surface
items: 360手机概念片Mountain
items: 360手机概念片Lens
items: Arnold to Maya MultiSub Shader

Katana批量镜头生产（一）
type: item
date: 2021-02-19T02:16:00+08:00
description: 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，首先应当考虑它的“通用性”和“易用性”。针对此话题我会在后面的文章中单独叙述。明目了上面的内容，那么就先要完成这个框架的建设。总体框架大概…

关于Katana Arnold输出MotionVector
type: item
date: 2020-05-10T04:54:00+08:00
description: 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上的一至。

Houdini Arnold自定义Cryptomatte
type: item
date: 2020-04-29T03:20:00+08:00
description: 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名称选项。

Houdini Solaris USD基础概念（一）
type: item
date: 2020-01-05T01:38:00+08:00
description: 基本概念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).（新特性（属性和关系））。A…

关于场景装配
type: item
date: 2019-10-26T02:57:00+08:00
description: 什么是场景装配？简单来说就是将收集的物体，材质，灯光，动画及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 iFX 4.0 SP1坑爹BUG
type: item
date: 2019-07-07T05:19:00+08:00
description: 不得不说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…

Autodesk Standard Surface
type: item
date: 2019-05-27T21:43:00+08:00
description: 伊利扬 · 格奥尔基耶夫、杰米 · 朴茨茅斯、扎普 · 安德森、阿德里安 · 赫鲁贝尔、艾伦 · 金、大垣慎司、弗雷德里克 · 斯文特版本 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 表示在最…

360手机概念片Mountain
type: item
date: 2018-08-19T02:00:00+08:00
description: software:MayaArnoldVrayNukeWorld Creator

360手机概念片Lens
type: item
date: 2018-08-18T02:05:00+08:00
description: software:MayaArnoldVrayNuke

Arnold to Maya MultiSub Shader
type: item
date: 2018-07-23T03:27:00+08:00
description: 功能：mtoa多维材质实现方法，以实现将多种材质或者多种纹理通过ID方式分配给不同物体。思路：aiSwitch是将多种shader切换输出，但aiSwitch的切换方式是以index值为准，比如当输入0时，则输出0的shader，这样我们可以给每个物体添加不同的index值，并将其传递到aiSwitch的index属性上。实现方法：依次将多个shader连接到aiSwitch的输入中，创建一个aiUserDataFloat节点，将outvalue输出到aiSwitch的index上:aiUserDataFloat节点上的attribute上填写传递的属性名称，比如index。选择物体的Shape节点，并给其添加一个浮点类型的属性，mtoa对自定义属性命名格式如下：mtoa_constant_<attribute-name>在这里，我们建立一个index的属性名称，则为mtoa_constant_index。数据类型为浮点，其它默认:创建属性完毕后会在物体的Shape节点下多出index属性:给每个物体设置好index的编号，最后渲染就能得到对应的shader结果: