Beispiel #1
0
        void RebuildSkyMatrices(float nearPlane, float farPlane)
        {
            if (!m_SkySettings)
            {
                return;
            }

            Matrix4x4 cubeProj = Matrix4x4.Perspective(90.0f, 1.0f, nearPlane, farPlane);

            // Ref: https://msdn.microsoft.com/en-us/library/windows/desktop/bb204881(v=vs.85).aspx
            Vector3[] lookAtList =
            {
                new Vector3(1.0f,   0.0f,  0.0f),
                new Vector3(-1.0f,  0.0f,  0.0f),
                new Vector3(0.0f,   1.0f,  0.0f),
                new Vector3(0.0f,  -1.0f,  0.0f),
                new Vector3(0.0f,   0.0f,  1.0f),
                new Vector3(0.0f,   0.0f, -1.0f),
            };

            Vector3[] upVectorList =
            {
                new Vector3(0.0f, 1.0f,  0.0f),
                new Vector3(0.0f, 1.0f,  0.0f),
                new Vector3(0.0f, 0.0f, -1.0f),
                new Vector3(0.0f, 0.0f,  1.0f),
                new Vector3(0.0f, 1.0f,  0.0f),
                new Vector3(0.0f, 1.0f,  0.0f),
            };

            for (int i = 0; i < 6; ++i)
            {
                Matrix4x4 lookAt      = Matrix4x4.LookAt(Vector3.zero, lookAtList[i], upVectorList[i]);
                Matrix4x4 worldToView = lookAt * Matrix4x4.Scale(new Vector3(1.0f, 1.0f, -1.0f)); // Need to scale -1.0 on Z to match what is being done in the camera.wolrdToCameraMatrix API. ...
                Vector4   screenSize  = new Vector4((int)m_SkySettings.resolution, (int)m_SkySettings.resolution, 1.0f / (int)m_SkySettings.resolution, 1.0f / (int)m_SkySettings.resolution);

                m_faceWorldToViewMatrixMatrices[i]     = worldToView;
                m_facePixelCoordToViewDirMatrices[i]   = ComputePixelCoordToWorldSpaceViewDirectionMatrix(0.5f * Mathf.PI, screenSize, worldToView, true);
                m_faceCameraInvViewProjectionMatrix[i] = Utilities.GetViewProjectionMatrix(lookAt, cubeProj).inverse;
            }
        }
        void RebuildSkyMeshes(float nearPlane, float farPlane)
        {
            if (m_CubemapFaceMesh[0] == null)
            {
                Matrix4x4 cubeProj = Matrix4x4.Perspective(90.0f, 1.0f, nearPlane, farPlane);

                Vector3[] lookAtList =
                {
                    new Vector3(1.0f,   0.0f,  0.0f),
                    new Vector3(-1.0f,  0.0f,  0.0f),
                    new Vector3(0.0f,   1.0f,  0.0f),
                    new Vector3(0.0f,  -1.0f,  0.0f),
                    new Vector3(0.0f,   0.0f,  1.0f),
                    new Vector3(0.0f,   0.0f, -1.0f),
                };

                Vector3[] UpVectorList =
                {
                    new Vector3(0.0f, 1.0f,  0.0f),
                    new Vector3(0.0f, 1.0f,  0.0f),
                    new Vector3(0.0f, 0.0f, -1.0f),
                    new Vector3(0.0f, 0.0f,  1.0f),
                    new Vector3(0.0f, 1.0f,  0.0f),
                    new Vector3(0.0f, 1.0f,  0.0f),
                };

                for (int i = 0; i < 6; ++i)
                {
                    Matrix4x4 lookAt = Matrix4x4.LookAt(Vector3.zero, lookAtList[i], UpVectorList[i]);
                    m_faceCameraViewProjectionMatrix[i]    = Utilities.GetViewProjectionMatrix(lookAt, cubeProj);
                    m_faceCameraInvViewProjectionMatrix[i] = m_faceCameraViewProjectionMatrix[i].inverse;

                    m_CubemapFaceMesh[i] = BuildSkyMesh(Vector3.zero, m_faceCameraInvViewProjectionMatrix[i]);
                }
            }
        }