Unity3D 神奇的GetGPUProjectionMatrix函数

UnityEngine.GL 中有一个函数GetGPUProjectionMatrix 具体可以参考官方说明文档。

这函数的作用,是用来处理DX 和OpenGL的坐标差异性的。

DX是以左上角为(0,0) OpenGL是以右下角为(0,0) 。

DX的Z范围是(0,1) GL是(-1,1)。

所以,unity3d引擎渲染的时候,根据使用的不同渲染器,通过该函数处理,即可,统一DX 和GL

        //
        // 摘要:
        //     ///
        //     Compute GPU projection matrix from camera's projection matrix.
        //     ///
        //
        // 参数:
        //   proj:
        //
        //   renderIntoTexture:
        public static Matrix4x4 GetGPUProjectionMatrix(Matrix4x4 proj, bool renderIntoTexture);

根据DX 和GL的差异性,就可以知道这个函数,当使用DX渲染的时候(底层统一用的是Opengl方式的)就是把DX 的Z轴,从-1,-1映射会(0,1)。y轴进行翻转了。


还是从帧调试开始吧,如图:

Unity3D 神奇的GetGPUProjectionMatrix函数_第1张图片


可以看出,在渲染平行光的时候,把深度值渲染到了一个Canera Depth这样的一个RT上,这时候发现着色器的值unity_MatrixVP。

如果直接用mCamera.projectionMatrix* mCamera.worldToCameraMatrix 这样得到的值和这个不一样

。必须通过

        //深度值,渲染到纹理。Y要翻转
        Matrix4x4 projectionMatrix = GL.GetGPUProjectionMatrix(mCamera.projectionMatrix, true);
        unity_MatrixVP = projectionMatrix * mCamera.worldToCameraMatrix;

Unity3D 神奇的GetGPUProjectionMatrix函数_第2张图片

你可能感兴趣的:(U3D,Shader)