我一直在研究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)?
答案 0 :(得分:0)
在后视中感觉有点傻,因为这只是定期优化的结果。
除法是常规透视除法(但是将用于深度缓冲/剔除的z坐标保持为线性,因此w应该为1.0以确保适当的深度插值)。据推测,重新组织计算可以节省着色器周期和/或精确度。
这段代码相当于通过先将pos.z除以pos.z来缩短pos.xy,然后将pos.xy的点积与自身一起得到它在2D屏幕空间中的长度平方(然后将其夹紧等)