在某些特定应用场景,比如说屏幕空间反射SSR,会要求我们从深度缓冲中重建像素点的世界空间位置。本文介绍在Unity中如何从深度缓冲中重建世界空间位置。
第一种方法是通过像素的屏幕坐标位置来计算。
(1)首先将屏幕空间坐标转换到NDC空间中。
注意1:ComputeScreenPos返回的值是齐次坐标系下的屏幕坐标值,其范围为[0, w]。
所以这里先将范围转为[0, 1],再转为[-1, 1]。
注意2:oscreenPosz本身就是裁剪空间下的值,范围为[-w, w],除以w范围已经转为[-1, 1],已经没有必要再2-1,所以这里的z值多做了一步 *** 作,导致变成没有意义的值,但是这里的z值没有用处。
(2)然后将屏幕像素对应在摄像机远平面(Far plane)的点转换到剪裁空间(Clip space)。因为在NDC空间中远平面上的点的z分量为1,所以可以直接乘以摄像机的Far值来将其转换到剪裁空间(实际就是反向透视除法)。
(3)接着通过逆投影矩阵(Inverse Projection Matrix)将点转换到观察空间(View space)。
(4)已知在观察空间中摄像机的位置一定为(0,0,0),所以从摄像机指向远平面上的点的向量就是其在观察空间中的位置。将向量乘以线性深度值,得到在深度缓冲中储存的值的观察空间位置。
(5)最后将观察空间中的位置变换到世界空间中。
第二种方法是利用在世界空间中从摄像机指向屏幕像素点的向量来计算。
(1)首先构造在世界空间中从摄像机指向屏幕像素点的向量。
(2)将向量转换到观察空间,存储其z分量的值。注意向量和位置的空间转换是不同的,当w分量为0的时候Unity会将其视为向量,而当w分量为1的时候Unity将其视为位置。
(3)在深度缓冲中采样。这里使用tex2Dproj而不是tex2D的原因是screenPos是用ComputeScreenPos来计算得到的,用tex2Dproj可以帮我们做透视除法。
(4)因为像素点的观察线性深度就是其在观察空间中的z分量,所以根据向量的z分量计算其缩放因子,将向量缩放到实际的长度。
(5)最后以摄像机为起点,缩放后的向量为指向向量,得到像素点在世界空间中位置。
1,如果只是要不定期取一下这个数值,调用scrollViewgetScrollY(),如果是横向的scrollView,换成X。
2,如果要随时使用这个值,例如正在scroll过程中,其他控件要随着卷动的位置变化,需要继承一下并且重载onScrollChanged(int, int, int, int),这样每个scroll动作,都会被调用,告知当前scroll的位置以及上一次的位置。如果是横向,那么参数1,3起作用,纵向为2,4
unity官网下载的资源包方法如下:
1、进入unity官网点击下载unity按钮。
2、选择补丁程序版unity2017x下载standardassets。
3、下载后是一个exe安装程序,前面按照提示来就行,安装位置会默认是unity的编辑器的安装所在位置,不是此位置建议手动更改至此。
4、安装好后记住在上一步骤中的路径,在unity中的assets-importpackage-custompackage按照上述路径打开文件夹,选择需要导入的资源包。
以上就是关于Unity从深度缓冲重建世界空间位置全部的内容,包括:Unity从深度缓冲重建世界空间位置、如何获取unity中scrollview中的项、unity官网下载的资源包在哪等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)