ARTICLE DETAIL

资讯详情

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

TiXL DrawMesh 详解:PBR 网格渲染的核心绘制操作符与渲染管线用法

TiXL DrawMesh 详解:PBR 网格渲染的核心绘制操作符与渲染管线用法 TiXL DrawMesh 详解PBR 网格渲染的核心绘制操作符与渲染管线用法【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3TiXLt3是一个开源实时动态图形创作软件其渲染架构围绕“算子图”Operator Graph构建。DrawMesh是Lib.mesh.draw类别中最核心的 PBR 网格绘制操作符负责把输入的几何体MeshBuffers以物理渲染PBR方式绘制到 RenderTarget。读完本文你将掌握 DrawMesh 的全部输入参数、默认行为、内部着色器与执行机制以及它与 SetMaterial、SetEnvironment、SetPointLight 等算子组合出完整 3D 场景的实战方法。DrawMesh 在渲染管线中的定位在 TiXL 中DrawMesh使用 PBR 渲染来绘制传入的几何体geometry和网格节点meshnodes并按目标设置输出光照结果。为了方便ToollTiXL 编辑器默认会在 RenderTarget 上附加一个反射IBL 环境反射和两个绑定在摄像机上的点光源你可以通过在图中更靠前更靠右的位置添加 SetMaterial 和SetEnvironment算子来覆盖这些默认设置。除了默认光照之外DrawMesh 还允许通过多种参数调整绘制效果例如线框渲染wireframe或双面渲染both sided rendering。这些能力在实时 VJ、舞台视觉与动态图形创作中非常实用。完整的 TiXL 渲染管线交互式教程存放在示例项目 HowToDrawThings 中建议在实际搭建场景前先打开它走一遍流程。最常用的渲染算子家族DrawMesh属于Lib.mesh.draw类别下的一组“绘制Draw”算子类别索引见 Lib.mesh.draw 目录索引。最常用的渲染方法包括算子作用DrawMeshPBR 渲染传入的几何体与网格节点按目标设置着色本文主角DrawMeshUnlit不带任何着色Unlit地绘制几何体DrawMeshHatched以抽象艺术风格阴影线绘制几何体DrawMeshAtPoints根据连接的点缓冲区以 PBR 着色绘制网格的实例这些 Draw 算子可以与 SetMaterial、SetFog、SetPointLight以及许多其他算子组合共同营造出场景的外观。同类别中还包含 DrawMeshCelShading卡通着色、DrawMeshChunksAtPoints、DrawMeshWithShadow配合SetShadow与SetPointLight渲染阴影贴图以及 VisualizeUvMapUV 检查工具。输入参数详解DrawMesh 的全部输入参数如下与官方文档一致并结合源码补充默认值与取值范围名称关联度与类型说明默认值 / 取值范围MeshMeshBuffers必填传入的网格几何体输入—ColorVector4定义网格的着色颜色。若使用了 SetMaterial该颜色会与其设置相乘默认(1,1,1,1)AlphaCutOffSingle当使用含 Alpha 通道的纹理时控制透明度裁剪阈值片元 alpha 低于该值将被 discard默认0.0关闭BlendModeInt32选择混合模式默认0Normal可选值见下文SharedEnums.BlendModesFillModeInt32在彩色线框渲染与默认着色方式之间切换默认3Solid2为 WireframeCullingCullMode定义表面的剔除方式None所有表面“双面”可见从任何一侧都可见Front法线翻转正面透明、背面可见Back默认正面可见、背面不可见默认BackShadingInt32选择着色模式默认0Default1为 Flat平面着色SpecularAASingle降低轮廓线与高频法线贴图区域的镜面锯齿默认0.5EnableZTestBoolean启用时丢弃被 z-buffer 排序淘汰的片元决定网格是否被自身或其他网格遮挡/遮挡它们默认trueEnableZWriteBoolean决定该网格是否向深度缓冲写入从而定义它与其他网格的前后覆盖关系默认trueFilterFilter定义纹理过滤模式默认MinMagMipLinearWrapModeTextureAddressMode定义纹理重复时的行为Wrap纹理无限重复Mirror纹理镜像后无限重复Clamp纹理在边缘被截断Border边界颜色文档标注为不确定MirrorOnce纹理镜像一次后被截断默认WrapUseMaterialIdString从当前上下文中已注册的 PBR 材质中按名称选中一个覆盖默认材质提供下拉列表选择默认DefaultFragmentFieldShaderGraphNode可选着色器图提供颜色函数。它使用世界坐标position.xyz生成颜色在绘制片元前相乘。可尝试SphereField - SdfToColor - .FragmentField的链路—ShaderDefinesString在渲染前注入的额外着色器代码。这要求你了解内部实现注入无效代码会破坏渲染。它类似 shader flags 但更强大因为还可以定义在渲染片元前应用的方法默认选项例如#define USE_WORLDSPACE输出名称类型OutputT3.Core.DataTypes.CommandOutput输出一个Command命令代表一次绘制调用可直接串联进渲染执行链。从源码看 DrawMesh 的执行机制DrawMesh 的实现位于 Operators/Lib/Symbols/mesh/draw/DrawMesh.cs它继承自InstanceDrawMesh并实现了ICustomDropdownHolder与ICompoundWithUpdate接口通过 GUIDa3c5471e-079b-4d4b-886a-ec02d6428ff6注册到算子库。执行流程Update 方法private void Update(EvaluationContext context) { if (context.Materials ! null) { _pbrMaterials.Clear(); _pbrMaterials.AddRange(context.Materials); } var previousMaterial context.PbrMaterial; var materialId UseMaterialId.GetValue(context); if (!string.IsNullOrEmpty(materialId)) { foreach (var m in context.Materials) { if (m.Name ! materialId) continue; context.PbrMaterial m; break; } } // Inner update Output.ConnectedUpdate(context); context.PbrMaterial previousMaterial; }执行逻辑可以概括为三步收集材质把当前EvaluationContext中已注册的PbrMaterial列表拷贝到内部缓存_pbrMaterials用于后续的下拉选项按名字切换材质若UseMaterialId非空则在上下文中按PbrMaterial.Name匹配并临时替换context.PbrMaterial执行子树并恢复调用Output.ConnectedUpdate(context)触发内部的渲染命令完成后把context.PbrMaterial恢复为切换前的值保证不影响后续算子。UseMaterialId 的自定义下拉DrawMesh 实现了ICustomDropdownHolder接口为UseMaterialId输入提供动态下拉GetOptionsForInput首先 yieldDefault然后遍历_pbrMaterials中所有材质把它们的Name未命名的显示为undefined作为候选选择结果通过HandleResultForInput回写为UseMaterialId的输入值。这意味着只要你在此前图中更靠右放置了带MaterialId的 SetMaterial 算子DrawMesh 的UseMaterialId下拉框就能直接列出这些材质名进行快速切换无需手敲字符串。ShadingModes 枚举源码中定义了两种着色模式private enum ShadingModes { Default 0, Flat 1, }Flat平面着色会忽略插值后的顶点法线改由屏幕空间导数计算几何法线适合低多边形、硬朗的视觉风格。着色器实现mesh-Draw.hlsl 逐段解读DrawMesh 的顶点与像素着色器模板位于 Operators/Lib/Assets/shaders/3d/mesh/mesh-Draw.hlsl它由内部的GenerateShaderGraphCode算子按模板生成模板路径Lib:shaders/3d/mesh/mesh-Draw.hlsl并注入#define USE_WORLDSPACE2具体配置可见算子定义文件 DrawMesh.t3。着色器模板内部定义了多个常量缓冲区寄存器内容b0Transforms摄像机/世界/物体空间变换矩阵b1ParamsColor、AlphaCutOff、UseFlatShading、SpecularAAb2FogParams雾颜色、雾距离与雾偏置b3PointLights最多 8 个点光源PointLight Lights[8]与激活数量b4PbrParamsBaseColor、EmissiveColor、Roughness、Specular、Metalb5由{FLOAT_PARAMS}占位符展开的浮点参数顶点着色器 vsMainvsMain使用SV_VertexID从结构化缓冲区PbrVertices与FaceIndices中取顶点数据faceIndex id / 3完成物体空间到裁剪空间的坐标变换ObjectToClipSpaceUV 的 V 轴翻转float2(uv.x, 1 - uv.y)切线空间基向量 TBN 变换到世界空间用于法线贴图雾因子计算当FogDistance 0时按pow(saturate(-posInCamera.z / FogDistance), FogBias)计算雾。法线计算 ComputeNormal当UseFlatShading 0.5时进入平面着色分支用ddx/ddy对世界位置求导得到几何法线再在其切空间上应用法线贴图细节否则走标准分支采样法线贴图解码2.0 * normalMap.rgb - 1.0后乘以 TBN 矩阵得到世界法线。镜面抗锯齿 AdjustRoughnessForSpecularAASpecularAA参数在像素着色器中实际生效通过屏幕空间导数ddx(frag.N)/ddy(frag.N)计算法线方差并按SpecularAA系数缩放后叠加到粗糙度上先转 alpha 再转回 roughness从而抑制轮廓线和高频法线贴图区域出现的镜面锯齿。这正是文档中“reduces specular aliasing on silhouettes and high-frequency normalmap regions”的底层实现。像素着色器 psMainpsMain的渲染流程为采样 RMO 贴图得到MetalnessroughnessMetallicOcclusion.y Metal与Occlusion.z采样BaseColorMap作为 albedo并与顶点色pin.colorRGB相乘计算法线frag.N粗糙度经AdjustRoughnessForSpecularAA调整计算视线方向frag.Lo由CameraToWorld得到眼睛位置调用ComputePbr()计算最终光照颜色乘以GetField(...)FragmentField 的世界空间颜色函数结果若AlphaCutOff 0且litColor.a AlphaCutOff则discardAlpha 裁剪分别向SV_Target0颜色缓冲与SV_Target1法线缓冲输出。需要注意psMain中的discard操作解释了AlphaCutOff的“透明度控制”语义它并不做半透明混合而是把低于阈值的片元整体丢弃适合实现镂空cutout透明效果。默认值与 .t3 配置算子定义文件 DrawMesh.t3 保存了每个输入参数的默认值FormatVersion: 3与上文参数表一一对应参数默认值Shading0DefaultFilterMinMagMipLinearFillMode3SolidAlphaCutOff0.0ColorX:1, Y:1, Z:1, W:1ShaderDefinesBlendMode0NormalCullingBackEnableZTesttrueSpecularAA0.5WrapModeWrapUseMaterialIdEnableZWritetrue该文件还揭示了 DrawMesh 内部封装的原语级节点包括VertexShader入口vsMain与PixelShaderFromSource入口psMainRasterizerStateCullMode、FrontCounterClockwise、AntialiasedLineEnabled、DepthStencilStateEnableZWrite、Comparison: LessEqual、EnableZTestPickBlendMode、BlendColors模式1、OutputMergerStage对应混合状态linearSampler/clampedSampler/texSampler三种采样器GetPbrParameters、ContextCBuffers、_TransformsCBuffer、FloatsToBuffer等资源绑定节点GetForegroundColor提供前景色与Execute绘制命令入口。从这些内部节点可以看出DrawMesh 本质上是一个复合算子它把“装配渲染状态 → 绑定资源 → 提交 Draw 调用”的完整 Direct3D 11 流程封装成一个高层的拖拽节点。默认光栅化状态可在 Core/Rendering/DefaultRenderingStates.cs 中看到对应实现FillMode.Solid、CullMode.Back、IsDepthClipEnabled。BlendMode 与混合模式枚举BlendMode输入映射到T3.Core.Utils.SharedEnums.BlendModes枚举定义于 Core/Utils/SharedEnums.cspublic enum BlendModes { Normal, Additive, Multiply, Invert, None, PreMultipliedExperimental, BlendOnWhite, BlendOnWhite01, UseImage_Alpha, }Normal标准 alpha 混合Additive叠加混合SourceAlpha到One适合光效、粒子等明亮叠加效果其底层 BlendState 描述可见 DefaultRenderingStates.csMultiply / Invert / None相乘、反相与不混合BlendOnWhite / BlendOnWhite01在白色背景上的预混合变体UseImage_Alpha使用图像自身的 alpha 通道。在实时渲染中Additive常用于辉光、火花、能量特效None则用于需要完全覆盖的纯色物体。与材质和场景算子组合PBR 材质管线DrawMesh 本身只提供颜色、裁剪、剔除、混合、深度等“绘制状态”而真正的 PBR 表面属性BaseColor、粗糙度、金属度、法线贴图、自发光等由 SetMaterial 算子注入到渲染上下文中。其参数与源码中的PbrParameters结构一一对应见 Core/Rendering/Material/PbrMaterial.csSetMaterial 参数PbrParameters 字段说明BaseColor / BaseColorMapBaseColor漫反射基色与纹理相乘EmissiveColor / EmissiveColorMapEmissiveColor自发光颜色与亮度RoughnessRoughness粗糙度默认材质0.5SpecularSpecular高光强度默认材质10MetalMetal金属度1可近似镜面chrome效果NormalMapNormalSrv法线贴图RoughnessMetallicOcclusionMapRoughnessMetallicOcclusionSrvR/G/B 通道分别存粗糙度/金属度/环境光遮蔽SetMaterial 在 Update 方法 中按脏标记DirtyFlag决定是否重建常量缓冲区并把自身注册进context.Materials列表——这正是 DrawMesh 的UseMaterialId下拉能够枚举到的材质集合两个算子的衔接点在源码层面清晰可见。组合要点依据 SetMaterial.md颜色与纹理相乘要显示 EmissiveColorMap必须先把 EmissiveColor 设为白色(1,1,1,1)否则贴图会被乘黑RMO 贴图合成粗糙度、金属度、遮蔽三种信息需用CombineMaterialChannels合成到一张贴图中再接入RoughnessMetallicOcclusionMapIBL 依赖粗糙表面需要 IBL 环境纹理由SetEnvironment提供即使不使用SetEnvironment也存在预定义的默认 IBL法线贴图生成没有现成法线贴图时可用NormalMap算子从高度图生成。典型的场景链路图中从左到右越靠右优先级越高[几何体生成/加载] → [SetMaterial] → [SetFog] → [SetPointLight] → [SetEnvironment] ↓ [DrawMesh]以及 DrawMeshUnlit / DrawMeshHatched / DrawMeshAtPoints ↓ [RenderTarget / 输出]实战配置建议线框预览把FillMode设为Wireframe2即可实现彩色线框渲染配合Culling: None可从任意角度观察模型结构双面渲染需要双面可见如薄片、纸张、单面模型时把Culling设为None透明镂空接入含 alpha 的纹理后从0.0逐步上调AlphaCutOff直到获得理想的镂空轮廓若需要真正的半透明混合则应使用BlendMode而非AlphaCutOff低多边形风格将Shading切换为Flat配合SetMaterial的粗糙度/金属度参数即可快速获得硬边风格化效果镜面闪烁抑制当模型轮廓或法线贴图细节出现高频闪烁时上调SpecularAA默认0.5ShaderDefines 风险提示该输入直接向生成后的 HLSL 注入代码需要了解内部实现注入无效代码会导致渲染被破坏非必要不修改多材质切换在图中放置多个带MaterialId的 SetMaterial 算子然后用 DrawMesh 的UseMaterialId下拉实时切换材质适合演出中快速换肤。进一步探索完整渲染管线交互教程HowToDrawThings同类绘制算子索引Lib.mesh.draw READMEPBR 材质算子文档SetMaterial底层材质数据与默认材质PbrMaterial.cs绘制算子实现DrawMesh.cs、算子定义 DrawMesh.t3着色器模板mesh-Draw.hlsl【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表