ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

OpenUSD RenderVar 完全指南:用 UsdRender 定义任意输出变量(AOV)通道

OpenUSD RenderVar 完全指南:用 UsdRender 定义任意输出变量(AOV)通道 OpenUSD RenderVar 完全指南用 UsdRender 定义任意输出变量AOV通道【免费下载链接】OpenUSDUniversal Scene Description项目地址: https://gitcode.com/GitHub_Trending/ope/OpenUSDRenderVar 是 OpenUSD UsdRender 模式族中描述渲染器计算输出的某个数据量/通道的 Schema在行业里通常被称为任意输出变量Arbitrary Output VariableAOV。本指南以 docs/user_guides/schemas/usdRender/RenderVar.md 为核心结合仓库中的 schema 定义与生成源码系统讲解 RenderVar 的概念、dataType/sourceName/sourceType三个属性的语义与取值、如何在 USDA 中实际编写 RenderVar以及它如何通过 RenderProduct 的orderedVars被组织进一次真实渲染。读完本文你将能够为 OpenUSD 场景准确编写并组织任意输出通道颜色、Alpha、LPE 光照表达式、深度、ID 等并理解渲染器消费这些描述时的约定。什么是 RenderVar渲染器输出的一份计算数据通道按照 RenderVar 文档的定义RenderVar 表示由渲染器产生的一个数量quantity或通道channel的计算数据在渲染管线中通常被称为任意输出变量AOV。渲染器在生成最终画面的过程中除了输出最终的颜色像素外还会为合成compositing与后期流程输出大量辅助数据这些数据在画面上的每个像素处取值各不相同RenderVar 就是用来描述我需要这样一份输出数据的标准 Schema。典型的 RenderVar 示例包括几何测量量如相机空间深度camera-space depth材质着色器发射的量如颜色color或 Alpha 通道光路径表达式Light Path ExpressionLPE如直接漫反射、间接镜面反射等按光路分类的贡献量渲染器固有量如每个像素的计算时间。名字即数据变量名RenderVar prim 命名约定一个关键约定是RenderVar prim 的名字prim name直接驱动渲染器产出的数据变量名。例如一个名为alpha的 RenderVar通常意味着渲染器应当输出一份名为alpha的 Alpha 通道数据到渲染结果中。这意味着编写 RenderVar 前应当先与目标渲染器确认其支持的输出通道命名文档明确说明USD 目前并不强制一套通用的 RenderVar 名称与格式因此渲染器专有的 RenderVar 是被预期和允许的。数据来源source的三种典型形态RenderVar 还可以描述数据的来源信息source文档归纳为三类典型形态着色器输出某个材质着色器产生的输出如Ci、a渲染器输出渲染器自己生成的深度、法线等通道光路径表达式LPE用 OSL Light Path Expressions 语言描述的按光路拆分的输出。RenderVar 在 UsdRender 模式族中的位置RenderVar 不是孤立使用的。UsdRender 模式族由四个 Schema 协同工作见 docs/user_guides/schemas/usdRender/overview.mdSchema职责RenderSettings封装一次渲染调用所需的全部全局设置并通过products关系指定要产生的输出产物RenderProduct表示单个输出产物渲染图片文件、深度缓冲等通过orderedVars组合一个或多个 RenderVarRenderVar表示一份可随输出产物像素变化的计算数据通道AOVRenderPass表示多通道渲染工作流中的单个渲染通道如前景/背景/合成分离其中RenderVar 通过 RenderProduct 传达给渲染器或渲染管线RenderProduct 通过orderedVars关系指定一个或多个 RenderVar渲染器将这些 RenderVar 组合起来生成输出产物。若场景未指定 RenderProduct支持 OpenUSD 的渲染器应默认产出一份 RGB 图像一旦提供了 RenderProduct则产物应显式声明其需要哪些 RenderVar。RenderVar 的三个核心属性RenderVar 是一个 Concrete Typed Schema在 pxr/usd/usdRender/schema.usda 中定义了三个uniform属性。下表汇总了完整签名属性USD 类型回退值Fallback作用dataTypetokencolor3f该数据量的类型用 USD 属性类型表示如color3f、float、intsourceNamestring空字符串包含该 RenderVar 计算值的数据源名称sourceTypetokenraw数据源的类型allowedTokens 为raw、primvar、lpe、intrinsicdataType通道的数据类型USD 类型token回退值color3f语义该数量在 USD 属性类型体系中的类型例如颜色通道用color3fAlpha 通道用floatID 通道用int。在生成的 C 代码中见 pxr/usd/usdRender/var.cppdataType属性通过GetDataTypeAttr()/CreateDataTypeAttr()访问底层类型为TfToken使用SdfValueTypeNames-Token且变异性为SdfVariabilityUniform。sourceName数据源名称USD 类型string回退值空语义包含该 RenderVar 计算值的数据源名称。例如对名为alpha的 RenderVarsourceName设为a表示计算得到的 Alpha 值可以从某个数据源的a通道获取。从源码看var.cppsourceName是SdfValueTypeNames-String的 uniform 属性。sourceType数据源的类型USD 类型token回退值raw语义数据源的类型。USD 提供以下取值与 schema.usda 中的allowedTokens一致sourceType含义raw将sourceName原样直接传给渲染器这是默认行为primvar数据源表示一个 primvar 的名称。部分渲染器会据此确保该 primvar 被提供另一些渲染器可能要求提供合适的材质网络此时该设置仅起提示advisory作用lpe指定一条 OSL Light Path Expressions 语言的光路径表达式作为数据源。部分渲染器可能使用 OSL LPE 语法的扩展这种扩展必然不可移植intrinsic当前尚未实现代表 UsdRender 未来提供可移植基线 RenderVar 的命名空间例如相机深度等各渲染器实现可能不同值得注意的细节intrinsic目前仅是未来扩展方向。在 pxr/usd/usdRender/var.h 的类注释中可以看到未来 UsdRender 可能将_r_、_g_、_b_、_a_、_z_、_id_等众所周知的变量标准化到intrinsic名下。实战编写四个典型 RenderVar文档给出了一组完整可复制的示例覆盖了四种典型场景。下面直接继承原文档的代码并逐条解释def RenderVar color { string sourceName Ci } def RenderVar alpha { token dataType float string sourceName a } def RenderVar directDiffuse { string sourceName CRD[L.O] token sourceType lpe } def RenderVar id { token dataType int string sourceName id }逐条解读color指定一个颜色输出通道sourceName CiCi是经典渲染器约定中的最终表面颜色着色器输出名sourceType未写使用默认的rawdataType使用默认的color3f。alpha指定 Alpha 输出通道显式把dataType声明为floatsourceName a表示从数据源的a通道取值。directDiffuse指定名为directDiffuse的输出通道sourceName CRD[L.O]是一条 OSL 光路径表达式sourceType lpe告诉渲染器该表达式需要按 LPE 语法解析。id指定id输出通道dataType intsourceName id使用非标准数据源——例如被渲染对象的自定义标识符。将 RenderVar 组织进一次真实渲染通过 RenderProduct 的 orderedVars 组合通道RenderVar 必须经由 RenderProduct 才能传达给渲染器。RenderProduct 通过orderedVars关系relationship指定参与合成输出产物的 RenderVar 集合关系目标的顺序会被传给输出工具因为生成产物时可能需要依赖顺序。将上面的四个 RenderVar 挂接到PrimaryProduct上示例来自 RenderProduct.md 与 overview.mddef RenderProduct PrimaryProduct { rel camera /World/main_cam token productName /scratch/tmp/render000009.exr rel orderedVars [ /Render/Vars/color, /Render/Vars/alpha, /Render/Vars/directDiffuse, /Render/Vars/id ] } def Scope Vars { def RenderVar color { string sourceName Ci } def RenderVar alpha { token dataType float string sourceName a } def RenderVar directDiffuse { string sourceName CRD[L.O] token sourceType lpe } def RenderVar id { token dataType int string sourceName id } }此时渲染器收到的指令是为PrimaryProduct输出到/scratch/tmp/render000009.exr同时计算 color、alpha、directDiffuse、id 四个通道并组合进输出产物。最佳实践将 RenderVar 归组到 Render 根 prim 下UsdRender 官方最佳实践建议将场景中所有 UsdRender primRenderSettings、RenderProduct、RenderVar、RenderPass统一归组在名为Render的公共根 prim 下参见 overview.md。这样渲染相关的规格说明与其余场景数据隔离即使在大场景中也能借助 UsdStage masking 等特性高效访问渲染配置def Scope Render { def RenderSettings PrimarySettings { rel products /Render/PrimaryProduct int2 resolution (512, 512) } def RenderProduct PrimaryProduct { token productName /scratch/tmp/render000009.exr rel orderedVars [ /Render/Vars/color, /Render/Vars/alpha, /Render/Vars/directDiffuse, /Render/Vars/id ] } def Scope Vars { # 上面的四个 RenderVar 定义 } }同时还应始终在 stage 根层的renderSettingsPrimPath元数据中声明默认 RenderSettings完整用法见 RenderSettings.md#usda 1.0 ( renderSettingsPrimPath /Render/PrimarySettings )若场景提供多个 RenderSettings如 preview 与 final 各一套该元数据即可明确告知渲染器哪一份是默认配置。源码级印证从 Schema 到生成 APIRenderVar 的权威定义位于 pxr/usd/usdRender/schema.usda它继承自TypedclassName Var。从这段声明可以确认三个属性均为uniform同一 prim 的该属性不随时间变化sourceType显式声明了allowedTokens [raw, primvar, lpe, intrinsic]文档注释与类注释相互印证prim 名字驱动输出数据变量名intrinsic是面向未来的可移植基线 RenderVar 命名空间。基于 schema.usda构建系统会生成 C 类UsdRenderVarpxr/usd/usdRender/var.h与相应实现pxr/usd/usdRender/var.cppUsdRenderVar::Define(stage, path)以RenderVar作为 USD prim type 名在指定路径定义 primvar.cpp三个属性的访问器GetDataTypeAttr()、GetSourceNameAttr()、GetSourceTypeAttr()分别返回对应 attribute属性 token 定义在UsdRenderTokens中var.cppGetSchemaAttributeNames()返回本 schema 自有属性集合{dataType, sourceName, sourceType}var.cpp。也就是说文档中看到的每一条属性语义都与其在 schema.usda 中的声明、生成代码中的类型Token/String以及回退值一一对应而本文档本身正是由genSchemaDocs工具从 schema 定义自动生成的文档头部标注 THIS FILE IS GENERATED BY genSchemaDocs。延伸阅读与使用建议想了解 RenderVar 如何被 RenderSettings 全局引用请阅读 RenderSettings.mdproducts关系、includedPurposes、materialBindingPurposes、renderingColorSpace等想了解 RenderProduct 如何组合通道、如何按产物覆盖相机与分辨率请阅读 RenderProduct.mdorderedVars、productName、productType想了解多通道渲染与 RenderPass 集合renderVisibility、prune、matte等如何与 RenderVar 配合请阅读 overview.md源码入口pxr/usd/usdRender/schema.usda、pxr/usd/usdRender/var.h、pxr/usd/usdRender/var.cpp。实践要点回顾① RenderVar prim 名决定渲染器输出的数据变量名编写前先与渲染器确认命名②sourceType默认raw只有 LPE 与 primvar 场景需要显式修改③dataType默认color3f标量通道Alpha、ID务必显式声明④ RenderVar 必须通过 RenderProduct 的orderedVars挂接进渲染⑤ 建议把全部 UsdRender prim 归组到Render根 prim 下并设置默认renderSettingsPrimPath。【免费下载链接】OpenUSDUniversal Scene Description项目地址: https://gitcode.com/GitHub_Trending/ope/OpenUSD创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表