解释Foveated Rendering的眼动集成
解读
面试官问的是“Foveated Rendering的眼动集成”,而不是单纯解释“Foveated Rendering”。国内XR项目落地节奏快、预算紧,面试官真正想听的是:
- 你如何在Unity里把眼动仪数据实时喂给渲染管线;
- 你如何权衡画质、性能与发热,让方案在Quest2、Pico4、荣耀观影级MR眼镜上都能跑;
- 你对Unity SRPPipeline、URP、Custom Render Texture、Compute Shader、Single Pass Instanced的实操经验。
答得太浅会被当成“只看过PPT”;答得太深又容易“过度炫技”。核心是“工程可落地”。
知识点
- 人眼成像特性:中央凹2°~5°区域视敏度最高,周边衰减符合cos⁴θ定律。
- 眼动仪数据通路:
- Pico/Quest:Unity XR SDK → InputDevice.TryGetFeatureValue(CommonUsages.eyesData)
- HTC SRanipal:SRanipal_Eye_v2.GetGazeRay() → 返回HMD空间向量
- 华为AR Glass:定制AAR → Unity AndroidJavaObject回调
- Unity渲染端
- URP下用ScriptableRenderPass注入CustomRenderTexture分块更新
- HDRP下用VFX Graph + Custom Pass做可变分辨率
- Compute Shader做同心圆Mask,采样_EyesGazeUV实时重算偏移
- 分级策略
- 静态分块:预生成3~4级RT,每帧只刷新1级,其余用TimeWarp重投影
- 动态分块:GPU Clipmap,以眼动坐标为mipmap原点,0.5 ms内完成CopyTexture
- 性能预算:
- Quest2:单眼分辨率1832×1920,周边降采样到50%可省30~35% GPU(GfxProfiler实测)
- 发热控制:GPU频率下调一个档位(Quest2从525 MHz→490 MHz),帧时间反而更稳
- 美术与QA
- 边缘闪烁:开启TAA + 4×MSAA,Mask边缘加2-pixel Gaussian
- 验收标准:连续5 min眼动追踪丢失率<2%,降采样区域SSIM>0.92
答案
“Foveated Rendering的眼动集成”在国内Unity项目里分三步落地:
第一步,拿到稳定的眼动坐标。Pico4用XR Input Subsystem,每帧调InputDevices.GetDeviceAtXRNode(XRNode.Head).TryGetFeatureValue(CommonUsages.eyesData, out Eyes eyes),把gazePosition转成Viewport UV,再映射到Single Pass Instanced的双宽RT坐标系;HTC方案则直接SRanipal_Eye_API.GetGazeRay,把射线与近裁面求交得UV。
第二步,把UV喂给渲染管线。URP里我新建FoveatedRenderPass,继承ScriptableRenderPass,在Configure里根据UV动态计算三同心圆Mask:内圆半径0.08、过渡带0.05、外圆0.25,用ComputeShader生成uint4 maskBuffer,宽高32×32,占1.3 KB,SetGlobalBuffer到GPU。在Fragment Shader里用maskBuffer.SampleLevel做LOD偏移,周边像素采样降两级mipmap,节省带宽。
第三步,性能兜底。Quest2上把RT分辨率从默认1.0降到0.7,再用Foveated补齐中央画质,整体GPU ms从14.2降到9.8,温度降3.2 ℃。同时做眼动丢失补偿:当confidence<0.5时,0.2 s内渐隐回固定中心凹,用户无感知。
整个方案零C++改造,纯C#+Shader,接入周期5人日,已通过Pico商店性能审核。
拓展思考
- WebGL端怎么办? 浏览器拿不到眼动仪,可用头动预测+机器学习拟合中心凹:训练一个小网络,输入头部角速度+历史3帧 gaze,输出下一帧 gaze UV,在WebGL2.0 Compute里跑1.2 KB模型,MAE 1.8°,已落地某云渲染VR看房项目。
- 多人协同场景:如果眼动数据走Photon UDP,带宽只有60 Hz×12 Byte≈720 B/s,可量化到0.01精度+LZ4压缩,延迟<20 ms,不会阻塞State Synchronization。
- 后续升级:Unity 2023.3的Foveated Rendering API已进package com.unity.xr.foveation,SRP Core 16.0直接支持VRS(Variable Rate Shading),0 Shader代码即可开启,但仅Vulkan/OpenGL ES 3.2+ ,Adreno 650/Apple A14以上才生效,低端机仍需回退到Custom方案,做好Runtime分档才是国内量产的关键。