跳到主要内容

控制头发高光

常见实现方法

绘画作品 (作者: おののいもこ 魚介) 中的头发高光形态各异:

image-20230418010310888image-20230418010355314
环状点状天使环

实现这些高光常有以下方法:

绘制在贴图上

静态, 无光照, 但可控性最佳, 适合固定视角游戏或影视作品.

基于物理的渲染

这类方法通常用来做写实风格的头发:

img

想用在三渲二中必须加以风格化. 动态, 支持多光源, 可控性较差, 形状受拓扑影响大, 适合偏写实风格的游戏或影视作品.

材质捕捉 (MatCap)

请参考UTS.

img

MatCap Map Texture Example

imgimg
MatCap Map OffMatCap Map On

这种方法仅支持单个主光源, 形状可以通过MatCap Map自定义, 但高光出现的时机受视角和拓扑影响, 在模型的面数较低或者结构不合理时经常出现难看的高光, 适合对高光要求不高的游戏作品.

贴图投射

请参考UTS.

imgimg
Example TextureTexture Projection On

该方法沿视线方向投射贴图到头发上, 适合无论哪个角度看都一样的天使环高光.

基于切线传递的风格化Kajiya-Kay

这是MooaToon的创新算法之一.

Kajiya-Kay高光出现的时机依赖视线方向和切线方向, 通过切线传递可以自定义高光出现的时机, 而不受拓扑的影响. 再加上对高光Gradient的控制可以进一步细化高光形状, 理论上可以实现所有类型的高光, 可控性极佳, 适用于游戏和影视作品.

通过Houdini烘焙自定义的切线控制高光大致范围

经过之前的教程你应该熟悉使用Houdini烘焙顶点数据的流程了.

Front_Hair_Highlight_Tangent节点中, 椭球体的切线被传递给了头发, 用于定义头发高光的形状以及随光照和视角方向的移动轨迹:

image-20230430212326544

  1. Display Anisotropy_HighLight_Preview节点, 你可以看到以顶点色表示的高光范围
  2. 视口右上角选择cam1并启用Tie View To Camera/Light, 然后你可以移动视角以查看高光变化
  3. 在视口左下角调整光源旋转以查看高光变化

如果要使用你自己的模型, 你首先需要将以下节点中的Group设置为你自己的模型的头发Group:

image-20230430213931710

然后调整球体的Transform以适配头发形状, 并实时预览高光的变化.

提示

你也可以使用其他形状, 但需要注意的是必须具有切线属性, 且切线方向受UV方向影响.

接下来Bake_HighlightTangent_to_UV23节点中的代码会将切线烘焙到UV2和UV3, 通常无需修改此节点.

准备好后按照之前的流程将模型导出到UE, 确保头发使用的是分层材质:

image-20230501222354840

  1. 点击加号新建一层
  2. Layer Asset选择ML_KajiyaKayHairHighlight
  3. Blend Asset选择MLB_KajiyaKayHairHighlightBlend
  4. 调整Threshold, Feather, Range参数, 并使用Ctrl + L调整灯光方向, 你就能看到形状和Houdini中类似的动态高光:image-20230501223040918

现在, 高光的运动轨迹已经达到预期, 接下来只需要通过Mask控制高光的形状.

绘制Highlight Mask精细控制高光形状

类似于绘制Shadow Mask, 你可以在MooaToon\MooaToon-Project\Art\Models\NewTextures\HairHighlightMaskMap.spp找到Highlight Mask的示例源文件:

image-20230501224038999

  • 值为0.5时不影响高光
  • 值越接近0, 高光越容易消失, 值为0的区域永远不会出现高光
  • 值越接近1, 高光越容易出现

绘制完成后将贴图导出到UE, 并取消勾选sRGB. 然后设置Highlight Mask MapGradient Scale Intensity:

image-20230501225238093

image-20230501225420494