风格化眼睛
全库目录221
本文目录6
把虹膜和高光都画进同一张颜色图,转动视角时它们会一起移动,眼睛就像贴在球面上的图案。眼睛材质把虹膜放到表面后方,把角膜反射留在外表面,再分别处理眼睑遮挡。艺术化图案可以自由变化,这三层的空间关系仍要稳定。
虹膜的内部位置
先用平面模型说明视差。建立眼球局部切线坐标,外表面交点为 ,虹膜位于 ,。视线 从表面指向相机,向内的观察射线是 。令其 z 分量等于 ,得到 ,所以虹膜交点为:
正面观察时 ,图案不偏移。相机移到右边时,向内射线在更深的平面上向左移动,虹膜采样也向左。符号反了会产生凸起的印象。 使用眼球局部长度,交点映射到 UV 时再除以虹膜平面的宽高,不能直接把毫米和 UV 相加。
下面的 HLSL 机制片段假设 surfaceUV 对应外表面平面,planeSize 是该平面的局部宽高。调用者处理返回的有效标记,越界部分显示眼白或虹膜边缘遮罩。它没有模拟曲面折射。
bool IrisUV(float2 surfaceUV, float3 viewEye,
float depth, float2 planeSize, out float2 irisUV)
{
irisUV = surfaceUV;
if (viewEye.z <= 1e-4 || any(planeSize <= 0.0)) return false;
irisUV -= depth * viewEye.xy / viewEye.z / planeSize;
return all(irisUV >= 0.0) && all(irisUV <= 1.0);
}例如虹膜深度1毫米、平面宽10毫米、V=(0.6,0,0.8),U偏移为-1*0.6/0.8/10=-0.075。V改成(-0.6,0,0.8),偏移变为+0.075。若把1毫米直接当1个UV单位,偏移会扩大十倍;对同一输入逐项显示局部交点与UV可以定位单位错误。
接近侧面时分母趋近零,平面模型不再适合。限制最大偏移可以保护采样,但会改变深度表现;完整近景模型需用角膜交点和折射方向求内部交点。Snell 定律约束折射角,角膜曲率和介质折射率共同决定光路,单层 UV 偏移只保留可控的视差线索。
角膜反射与虹膜合成
虹膜纹理给出内部颜色,角膜法线决定表面反射方向。两者若共用偏移后的高光贴图,高光就会跟着虹膜沉到内部。将角膜反射独立求值,观察方向变化时才能保留外表面的位置感。
一个可检验的艺术近似使用 Schlick 反射系数:。 都归一化并处于同一空间, 是正面反射比例。假定输入反射环境已按角膜粗糙度预过滤,内部颜色已包含虹膜光照,则一次界面的简化合成为:
float facing = saturate(dot(corneaNormalWS, viewWS));
float F = F0 + (1.0 - F0) * pow(1.0 - facing, 5.0);
float3 color = (1.0 - F) * irisLit * eyelidVisibility
+ F * corneaReflection;这里用 1-F 减少内部层贡献,是为了避免两个满强度层直接相加。它省略多次折射、吸收和第二界面,不是眼球的完整能量传输解。风格化高光可再由专用遮罩塑形,但应记录它修改的是表面反射还是内部亮斑。内部亮斑可以模拟焦散的视觉线索,只有实际追踪或近似求解了聚光路径时才把它称为焦散计算结果。
眼睑与转动
眼睑遮罩作用于虹膜和眼白的可见区域,几何眼睑还会遮挡角膜反射。静态画在眼球 UV 顶部的暗带会随眼球转动,容易离开真正的上眼睑。近景可以在眼眶坐标中投影遮罩,或使用真实遮挡;远景采用固定遮罩时需要限制转动范围。
左右眼的注视目标应来自同一个空间点,各自根据眼球中心求方向。直接复制同一旋转只能表达平行视线,近距离注视会失去汇聚。目标过近时给最大转角与平滑速度设置上限,再检查眼睑和睫毛是否仍覆盖眼球边缘。
验证与成本
用正面、左右斜视和掠射四组相机位置,先显示虹膜 UV,再打开反射与眼睑。正面偏移应为零,左右偏移应反号;眼球转动时高光由反射方向决定,眼睑遮罩由眼眶决定。分层模型增加纹理读取,独立透明角膜还会增加绘制与排序成本,因此透明几何和单通道分层着色需按目标画面比较。
2026-10-22 执行 CPU参考测试通过,三项眼睛检查覆盖正面零偏移、斜视符号和掠射拒绝。编译检查已用 DXC 编译 IrisUV 与分层合成两个片段,目标为 ps_6_0;眼球曲面折射、引擎运行、GPU 捕获和性能测量未执行。
相关主题
参考资料
- Pharr、Jakob、Humphreys,PBRT 4e §9.3,Snell's Law 与 Fresnel Reflectance:支持界面方向和反射比例,2026-10-22 核对。本文平面视差与艺术合成是明示假设下的独立推导。