目录
场景:将虹膜与巩膜的属性通过混合节点整合,输出到 HDRP 主节点
场景:扩大过渡带,使虹膜与巩膜边界更柔和(适合卡通风格眼部)
一、前言
在眼部渲染中,巩膜(眼白)与虹膜(彩色部分)的自然过渡是提升真实感的关键。这两个区域不仅颜色不同,其材质属性(如法线、平滑度、次表面散射特性)也存在显著差异 —— 虹膜质地相对细腻,巩膜则更 “粗糙” 且带有细微血管。
Unity Shader Graph 中的巩膜虹膜混合节点(Sclera Iris Blend Node)专为解决这一问题设计,它能根据片段在眼部的位置,自动混合巩膜与虹膜的所有属性(颜色、法线、平滑度等),实现从虹膜到巩膜的无缝过渡。
该节点仅支持高清渲染管线(HDRP),是写实眼部材质管线的核心整合工具。本文将详细解析其功能、参数及应用,助力开发者实现自然融合的眼部效果。
二、节点功能概述
巩膜虹膜混合节点(Sclera Iris Blend Node)的核心功能是整合巩膜与虹膜的材质属性,通过判断当前渲染片段属于虹膜还是巩膜区域,动态混合两者的颜色、法线、平滑度及次表面散射特性,输出统一的属性集用于后续渲染(如输入到 HDRP 主节点)。
其核心特性在于:
- 基于物体空间位置自动区分虹膜与巩膜区域(通过距离虹膜中心的距离判断);
- 对所有属性(颜色、法线、平滑度等)进行平滑过渡混合,避免硬边;
- 整合次表面散射的扩散轮廓(Diffusion Profile),确保两个区域的透光特性自然衔接;
- 仅支持 HDRP,需与虹膜、巩膜相关节点(如虹膜 UV 定位、角膜折射节点)协同,构成完整的眼部渲染管线。
三、渲染管线兼容性
节点 | 通用渲染管线(URP) | 高清渲染管线(HDRP) |
---|---|---|
巩膜虹膜混合节点 | 不支持 | 支持 |
四、端口详解
4.1 输入端口(Input)
端口名称 | 类型 | 描述 |
---|---|---|
Sclera Color | Color | 巩膜(眼白)的颜色(包含血管、泛黄等细节) |
Sclera Normal | Vector3 | 巩膜表面的法线(控制漫反射方向,通常带有细微粗糙纹理) |
Sclera Smoothness | Float | 巩膜的平滑度(值较低,体现眼白的 “哑光” 质感,通常 0.1-0.3) |
Iris Color | Color | 虹膜的颜色(包含纹理、角膜缘环等细节) |
Iris Normal | Vector3 | 虹膜表面的法线(相对细腻,可能带有虹膜纹理的凹凸细节) |
Cornea Smoothness | Float | 角膜的平滑度(值较高,体现角膜的 “镜面” 特性,通常 0.8-1.0) |
IrisRadius | Float | 虹膜的半径(物体空间单位,默认 0.225,用于判断区域边界) |
PositionOS | Vector3 | 当前片段在物体空间中的位置(用于计算到虹膜中心的距离,区分区域) |
Diffusion Profile Sclera | Diffusion Profile | 巩膜的次表面散射扩散轮廓(控制光线在巩膜内的散射方式,如较宽的散射范围) |
Diffusion Profile Iris | Diffusion Profile | 虹膜的次表面散射扩散轮廓(散射范围较窄,体现虹膜的细腻透光) |
4.2 输出端口(Output)
端口名称 | 类型 | 描述 |
---|---|---|
EyeColor | Color | 最终眼睛颜色(混合后的巩膜与虹膜颜色,带有自然过渡) |
Surface Mask | Float | 表面遮罩(1 表示角膜 / 虹膜区域,0 表示巩膜区域,中间值为过渡带) |
Diffuse Normal | Vector3 | 漫反射法线(混合后的巩膜与虹膜法线,影响漫反射光照计算) |
Specular Normal | Vector3 | 高光法线(通常采用角膜法线,体现角膜的镜面反射特性) |
EyeSmoothness | Float | 最终眼睛平滑度(混合巩膜与角膜的平滑度,过渡自然) |
SurfaceDiffusionProfile | Diffusion Profile | 表面扩散轮廓(根据区域选择巩膜或虹膜的扩散轮廓,控制次表面散射) |
五、工作原理简析
巩膜虹膜混合节点的核心逻辑是 “区域判断 + 属性混合”,步骤如下:
-
区域划分:
- 以物体空间原点(虹膜中心)为基准,计算当前片段(PositionOS)到中心的径向距离(
distance = length(PositionOS.xy)
,忽略 Z 轴,假设眼部为 XY 平面对称); - 与 IrisRadius 比较:距离≤IrisRadius 为 “虹膜区域”,距离 > IrisRadius 为 “巩膜区域”,中间设置过渡带(如距离在 IrisRadius±0.02 范围内)。
- 以物体空间原点(虹膜中心)为基准,计算当前片段(PositionOS)到中心的径向距离(
-
过渡因子计算:
- 用
smoothstep
生成 0-1 的过渡因子(blendFactor
):虹膜区域blendFactor=1
,巩膜区域blendFactor=0
,过渡带内从 1 平滑降至 0。
- 用
-
属性混合:
- 颜色:
EyeColor = lerp(ScleraColor, IrisColor, blendFactor)
(虹膜区域显示虹膜色,巩膜区域显示眼白色,过渡带混合); - 法线:
DiffuseNormal = lerp(ScleraNormal, IrisNormal, blendFactor)
(混合漫反射法线,确保过渡自然); - 平滑度:
EyeSmoothness = lerp(ScleraSmoothness, CorneaSmoothness, blendFactor)
(虹膜区域用角膜平滑度,巩膜区域用巩膜平滑度); - 高光法线:通常保留角膜法线(
SpecularNormal = CorneaNormal
),因为角膜覆盖整个眼部表面,高光特性一致; - 扩散轮廓:
SurfaceDiffusionProfile = blendFactor > 0.5 ? DiffusionProfileIris : DiffusionProfileSclera
(根据区域选择对应轮廓); - 表面遮罩:
SurfaceMask = blendFactor
(直接用过渡因子表示区域归属)。
- 颜色:
六、应用场景与实战案例
6.1 写实眼部材质整合(HDRP)
场景:将虹膜与巩膜的属性通过混合节点整合,输出到 HDRP 主节点
- 连接流程:
hlsl
// 1. 获取巩膜属性 float3 scleraColor = _ScleraBaseColor * SAMPLE_TEXTURE2D(_ScleraTex, sampler_ScleraTex, IN.uv).rgb; float3 scleraNormal = UnpackNormal(SAMPLE_TEXTURE2D(_ScleraNormalMap, sampler_NormalMap, IN.uv)); float scleraSmoothness = 0.2; // 巩膜低平滑度 // 2. 获取虹膜属性(来自虹膜相关节点) float3 irisColor = IrisOutOfBoundColorClampNode.IrisColor; // 经过钳位的虹膜色 float3 irisNormal = UnpackNormal(SAMPLE_TEXTURE2D(_IrisNormalMap, sampler_NormalMap, irisUV)); float corneaSmoothness = 0.9; // 角膜高平滑度 // 3. 输入混合节点 ScleraIrisBlendNode.ScleraColor = scleraColor; ScleraIrisBlendNode.ScleraNormal = scleraNormal; ScleraIrisBlendNode.ScleraSmoothness = scleraSmoothness; ScleraIrisBlendNode.IrisColor = irisColor; ScleraIrisBlendNode.IrisNormal = irisNormal; ScleraIrisBlendNode.CorneaSmoothness = corneaSmoothness; ScleraIrisBlendNode.IrisRadius = 0.225; // 默认虹膜半径 ScleraIrisBlendNode.PositionOS = IN.objectPosition; ScleraIrisBlendNode.DiffusionProfileSclera = _ScleraDiffusionProfile; ScleraIrisBlendNode.DiffusionProfileIris = _IrisDiffusionProfile; // 4. 输出到HDRP主节点 o.Albedo = ScleraIrisBlendNode.EyeColor; o.Normal = ScleraIrisBlendNode.DiffuseNormal; o.Smoothness = ScleraIrisBlendNode.EyeSmoothness; o.SpecularNormal = ScleraIrisBlendNode.SpecularNormal; o.DiffusionProfile = ScleraIrisBlendNode.SurfaceDiffusionProfile;
6.2 调整过渡效果(HDRP)
场景:扩大过渡带,使虹膜与巩膜边界更柔和(适合卡通风格眼部)
- 参数调整:
- 手动扩展过渡范围:在自定义节点中修改
smoothstep
的阈值(如blendFactor = smoothstep(IrisRadius + 0.05, IrisRadius - 0.05, distance)
),使过渡带从 0.05 扩大到 0.1,边界更模糊。
- 手动扩展过渡范围:在自定义节点中修改
七、使用注意事项
-
渲染管线限制:仅支持 HDRP,URP 项目需手动实现混合逻辑(如上述工作原理中的步骤),但需注意次表面散射等高级特性可能无法复用。
-
参数匹配:
IrisRadius
必须与模型的实际虹膜尺寸一致(默认 0.225 对应 HDRP 标准模型),否则区域划分错误(如虹膜过大覆盖巩膜);- 扩散轮廓(Diffusion Profile)需提前在 HDRP 设置中创建(如巩膜用 “Skin” 轮廓,虹膜用 “Eye” 轮廓),错误的轮廓会导致次表面散射效果失真。
-
过渡自然度:
- 避免过渡带过窄(硬边)或过宽(虹膜与巩膜界限模糊),建议过渡范围为 IrisRadius 的 ±5%-10%(如半径 0.225 时,过渡带 0.205-0.245);
- 法线混合需确保方向连续,可通过法线贴图的细节弱化过渡痕迹。
-
高光一致性:角膜覆盖整个眼部表面,因此
SpecularNormal
建议使用角膜法线(而非混合法线),确保高光在虹膜和巩膜区域的连续性(如光线照射下,角膜高光形状一致)。
八、总结
巩膜虹膜混合节点(Sclera Iris Blend Node)是 HDRP 中整合眼部材质的 “最后一公里” 工具,其核心价值在于:
- 属性整合:将虹膜与巩膜的颜色、法线、平滑度等属性无缝混合,解决 “两张皮” 问题;
- 区域区分:基于位置自动判断区域,确保属性切换符合眼部解剖结构;
- 高级特性支持:整合次表面散射扩散轮廓,为写实眼部的透光效果提供保障。
在眼部渲染中,自然的过渡比单独的细节更重要。该节点通过精准的区域判断与平滑混合,为高质量眼部效果提供了统一的输出,是连接各细分节点(虹膜、巩膜、角膜)与主节点的关键枢纽。实际开发中,需结合模型比例、风格需求调整过渡参数,才能实现既真实又符合设计的眼部渲染。