【问题标题】:Google VR Lens Correction Uses Depth?谷歌 VR 镜头校正使用深度?
【发布时间】:2016-11-13 18:33:23
【问题描述】:

我一直在查看来自 Google GVR SDK for Unity 的镜头校正着色器代码,并且一直在摸索在视图空间位置的 z 分量(UNITY_MATRIX_MV,没有 UNITY_MATRIX_MVP 的透视变换) undistort() 函数(这是更简单的变体之一):

float r2 = clamp(dot(pos.xy, pos.xy) / (pos.z*pos.z), 0, _MaxRadSq);
pos.xy *= 1 + (_Undistortion.x + _Undistortion.y*r2)*r2;

根据我的理解,我们希望在 2D 屏幕空间中扭曲渲染图像以抵消镜头将应用的失真,通过该屏幕观看屏幕,我们到底在做什么将我们的半径(?)除以线性深度(pos .z) 平方?我可以设想这是代替除以 w 来获得透视,但是为什么我们要除以 z 分量的平方(这怎么会比简单地除以 z 或 w 更正确)?

【问题讨论】:

    标签: unity3d virtual-reality google-vr


    【解决方案1】:

    事后觉得有点傻,因为这只是定期优化的结果。

    分割是常规透视分割(但将用于深度缓冲/剔除的 z 坐标保留为线性,因此 w 应该为 1.0 以确保正确的深度插值)。重新组织计算大概是为了节省着色器周期和/或准确性。

    此代码等效于通过先将 pos.xy 除以 pos.z 来缩短 pos.xy,然后将 pos.xy 与自身相乘以使其长度在 2D 屏幕空间中平方(然后将其钳位等)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-24
      • 1970-01-01
      • 2018-06-05
      • 1970-01-01
      相关资源
      最近更新 更多