MP相关-头发的纵向夹角θ和最大高光
2025-11-9
| 2025-11-11
Words 1011Read Time 3 min
type
status
date
slug
summary
tags
category
icon
password

搞清楚定义

对于mp
M(p,θ) = g(β,θ - αp)
原论文就是
θ就是光线与视线 和 轴线T 夹角的和
范围是-180° 到 +180°
为什么不是0-360度?
因为环形高光实际上是两个半圆的叠加
前半球:θ = 0° 到 +180°
后半球:θ = 0° 到 -180°(等价于180°到360°)
不!!这还是不是核心!! 必须使用-180度 到 180度是有原因的!

怎么样!天使环状带才是最亮的!

在进行推导的时候,我们必须建立一个以椭圆为基础的3维坐标系
其中:
y轴垂直于地平线 发丝的横截面方向即N作为第二维度 (因为是圆柱 这个维度是平面那种维度卷成一圈的刺状向量) 然后第三维度根据他俩进行cross 表示平行于地平线的一圈
那么如果按照最高光都是垂直于T的化(脑子里想象一个平面卷成椭圆) 那这两个向量的关系其实是很多样的 可能是重合的 可能是投射的 那么重点 重点是这两向量必须都垂直于T 同时必须在对侧
所以如果要整个环状带的高光最亮,必须满足:
  1. V 和 L 都垂直于 T
  1. V 和 L 在对侧
notion image
为此 我们必须使用-180 ~ 180表示θ的范围
当 θ = 90 +(-90)= 0的时候,高光最大
但是!!!!
毛发是有微观结构的!!!!有毛鳞片倾角 所以 每个光路都有偏移
具体实现看HairBxDF头发

天才的近似设计

理论上这个公式里的θ:
// 理论正确方法(但性能差) float theta_i = acos(clamp(dot(L,T), -1, 1)); float theta_o = acos(clamp(dot(V,T), -1, 1)); float theta = theta_i + theta_o;
但是很显然,acros性能很差。于是通过 dot(T,L) + dot(T,V) 代替 角度。好处如下:

趋势相同

  • 头发的 θᵢ和 θₒ多在0°~90°(光线和视线很少沿 T 方向平行入射 / 观察);
  • 在 0°~90° 范围内,cosθ(即dot(T,L))和sin(90°-θ)的变化趋势完全一致(θ 增大时,两者都减小);
  • 对高光计算而言,我们只需要 “角度的相对变化趋势”(判断是否接近 R 分量的最佳角度),不需要 “绝对角度值”——dot(T,L)的变化趋势足够支撑这个判断,完全可以替代sinθᵢ

近似后的 “和” 依然能反映 “对称关系”(核心需求)

天使环高光的核心是 “V 和 L 对侧对称”,此时:
  • 光线侧:dot(T,L) ≈ a(比如 T 向上,L 从左来,dot≈0.5);
  • 视线侧:dot(T,V) ≈ -a(V 从右来,dot≈-0.5);
  • 近似 θ = a + (-a) = 0,正好对应 “R 分量最强的对称中心”—— 这和理论 θ=180°(对应对称)的 “视觉效果完全一致”。
换句话说,近似后的 “和” 依然能精准捕捉 “对称→高光最强” 的核心逻辑,这是近似成立的关键。

数值范围适配高光分布,避免异常

dot(T,L)dot(T,V)的范围是[-1,1],因此近似 θ 的范围是[-2,2]—— 这个范围正好适配 3 个高光瓣的分布:
  • R 分量(主高光):中心在 θ≈0(对称时);
  • TT 分量(次高光):中心在 θ≈±0.5(非对称但接近);
  • TRT 分量(高次高光):中心在 θ≈±1(更不对称);
通过clamp(代码中clamp(Context.XoL, -1.0f, 1.0f))还能避免极端值导致的高光异常,稳定性拉满。
  • 渲染
  • HLSL
  • 图形学
  • 头发光照计算理论知识NP相关 - Φ观测方位角差 和 理解
    Loading...