Exemplo n.º 1
0
        private void RenderToTextures(Camera CustomCamera, CameraData Data, LayerMask CullingMask, bool RenderMaskSeperate)
        {
            CustomCamera.clearFlags      = CameraClearFlags.SolidColor;
            CustomCamera.backgroundColor = Color.clear;

            switch (Data.replacement)
            {
            case ShaderReplacement.Mobile:

                //Set culling layers
                CustomCamera.cullingMask = CullingMask;

                //Render to mask buffer
                CustomCamera.targetTexture = Data.MaskBuffers[0];
                DrawMaskPasses(CustomCamera, Data, MaskShader, CullingMask);

                //Tell shaders not to use custom or precision depth/normals
                Shader.DisableKeyword("_PrecisionDepthNormals");
                Shader.DisableKeyword("_CustomDepthNormals");
                break;

            case ShaderReplacement.VR:

                //Set culling layers
                CustomCamera.cullingMask = CullingMask;

                //Render to a normal buffer
                CustomCamera.targetTexture = Data.Normals;
                DrawRegualarPass(CustomCamera, NormalShader);

                //Render to mask buffer
                CustomCamera.targetTexture = Data.MaskBuffers[0];
                DrawMaskPasses(CustomCamera, Data, MaskShader, CullingMask);

                //Tell shaders to use precision depth/normals
                Shader.EnableKeyword("_PrecisionDepthNormals");
                Shader.DisableKeyword("_CustomDepthNormals");
                break;

            case ShaderReplacement.Standard:
                if (RenderMaskSeperate)
                {
                    //Render to depth and normal buffers at once
                    RenderBuffer[] buffers = new RenderBuffer[] { Data.Depth.colorBuffer, Data.Normals.colorBuffer };
                    CustomCamera.SetTargetBuffers(buffers, Data.Depth.depthBuffer);
                    DrawRegualarPass(CustomCamera, DepthNormalShader);

                    //Render to mask buffer
                    CustomCamera.targetTexture = Data.MaskBuffers[0];
                    DrawMaskPasses(CustomCamera, Data, MaskShader, CullingMask);
                }
                else
                {
                    //Render to depth, normal and mask buffers at once
                    RenderBuffer[] buffers = new RenderBuffer[] { Data.Depth.colorBuffer, Data.Normals.colorBuffer, Data.MaskBuffers[0].colorBuffer };
                    CustomCamera.SetTargetBuffers(buffers, Data.Depth.depthBuffer);
                    DrawMaskPasses(CustomCamera, Data, DepthNormalMaskShader, CullingMask);
                }

                //Tell shaders to use custom depth/normals
                Shader.DisableKeyword("_PrecisionDepthNormals");
                Shader.EnableKeyword("_CustomDepthNormals");
                break;
            }
        }
Exemplo n.º 2
0
        private void PreShaderReplacement(Camera Camera, CameraData Data)
        {
            if (Projections.Count > 0 && shaderReplacement)
            {
                //Grab a reference to custom camera
                Camera customCamera = CustomCamera;

                //Set up camera
                customCamera.CopyFrom(Camera);
                customCamera.renderingPath       = RenderingPath.Forward;
                customCamera.depthTextureMode    = DepthTextureMode.None;
                customCamera.useOcclusionCulling = false;
                customCamera.allowMSAA           = false;
                customCamera.allowHDR            = false;
                customCamera.rect = FullRect;

                //Get render texture/s
                GetTextures(Camera, customCamera, Data.replacement);

                //Render into textures
                if (UnityEngine.XR.XRSettings.enabled && Camera.stereoTargetEye != StereoTargetEyeMask.None && Settings.SinglePassVR)
                {
                    //Create render textures for eyes
                    RenderTexture eyeDepth   = (Camera.actualRenderingPath == RenderingPath.DeferredShading)? RenderTexture.GetTemporary(UnityEngine.XR.XRSettings.eyeTextureWidth, UnityEngine.XR.XRSettings.eyeTextureHeight, 24, depthFormat) : null;
                    RenderTexture eyeNormals = RenderTexture.GetTemporary(UnityEngine.XR.XRSettings.eyeTextureWidth, UnityEngine.XR.XRSettings.eyeTextureHeight, 24, normalFormat);
                    RenderTexture eyeMask    = RenderTexture.GetTemporary(UnityEngine.XR.XRSettings.eyeTextureWidth, UnityEngine.XR.XRSettings.eyeTextureHeight, 24, maskFormat);

                    //Left eye
                    if (Camera.stereoTargetEye == StereoTargetEyeMask.Both || Camera.stereoTargetEye == StereoTargetEyeMask.Left)
                    {
                        //Position & rotation
                        customCamera.transform.position = Camera.transform.parent.TransformPoint(UnityEngine.XR.InputTracking.GetLocalPosition(UnityEngine.XR.XRNode.LeftEye));
                        customCamera.transform.rotation = Camera.transform.rotation * UnityEngine.XR.InputTracking.GetLocalRotation(UnityEngine.XR.XRNode.LeftEye);

                        //Projection matrix
                        customCamera.projectionMatrix = Camera.GetStereoProjectionMatrix(Camera.StereoscopicEye.Left);

                        //View matrix
                        Matrix4x4 worldToCamera = Camera.worldToCameraMatrix;
                        customCamera.worldToCameraMatrix = worldToCamera;

                        //Render
                        RenderToTextures(Camera, customCamera, Data.replacement, eyeDepth, eyeNormals, eyeMask, Camera.cullingMask);

                        //Blit into buffer
                        if (Camera.actualRenderingPath == RenderingPath.DeferredShading)
                        {
                            StereoDepthBlitLeft.SetTexture("_DepthTex", eyeDepth);
                            Graphics.Blit(eyeDepth, depthBuffer, StereoDepthBlitLeft);
                        }
                        Graphics.Blit(eyeNormals, normalBuffer, StereoBlitLeft);
                        Graphics.Blit(eyeMask, maskBuffer, StereoBlitLeft);
                    }

                    //Right eye
                    if (Camera.stereoTargetEye == StereoTargetEyeMask.Both || Camera.stereoTargetEye == StereoTargetEyeMask.Right)
                    {
                        //Position & rotation
                        customCamera.transform.position = Camera.transform.parent.TransformPoint(UnityEngine.XR.InputTracking.GetLocalPosition(UnityEngine.XR.XRNode.RightEye));
                        customCamera.transform.rotation = Camera.transform.rotation * UnityEngine.XR.InputTracking.GetLocalRotation(UnityEngine.XR.XRNode.RightEye);

                        //Projection matrix
                        customCamera.projectionMatrix = Camera.GetStereoProjectionMatrix(Camera.StereoscopicEye.Right);

                        //View matrix
                        Matrix4x4 worldToCamera = Camera.worldToCameraMatrix;
                        worldToCamera.m03 -= Camera.stereoSeparation;
                        customCamera.worldToCameraMatrix = worldToCamera;

                        //Render
                        RenderToTextures(Camera, customCamera, Data.replacement, eyeDepth, eyeNormals, eyeMask, Camera.cullingMask);

                        //Blit into buffer
                        if (Camera.actualRenderingPath == RenderingPath.DeferredShading)
                        {
                            StereoDepthBlitRight.SetTexture("_DepthTex", eyeDepth);
                            Graphics.Blit(eyeDepth, depthBuffer, StereoDepthBlitRight);
                        }
                        Graphics.Blit(eyeNormals, normalBuffer, StereoBlitRight);
                        Graphics.Blit(eyeMask, maskBuffer, StereoBlitRight);
                    }

                    //Release eye render textures
                    if (Camera.actualRenderingPath == RenderingPath.DeferredShading)
                    {
                        eyeDepth.Release();
                    }
                    eyeNormals.Release();
                    eyeMask.Release();
                }
                else
                {
                    RenderToTextures(Camera, customCamera, Data.replacement, depthBuffer, normalBuffer, maskBuffer, Camera.cullingMask);
                }

                //Set completed render texture/s as global shader buffers
                SetAsBuffers(Camera, Data.replacement);
            }
        }
Exemplo n.º 3
0
        private void PreShaderReplacement(Camera Camera, CameraData Data)
        {
            if (Projections.Count > 0 && shaderReplacement)
            {
                //Grab a reference to custom camera
                Camera customCamera = Data.CustomCamera;

                //Set up camera
                customCamera.CopyFrom(Camera);
                customCamera.renderingPath    = RenderingPath.Forward;
                customCamera.depthTextureMode = DepthTextureMode.None;

                //Should we render the mask layers in a seperate pass
                bool renderMaskSeperate = (Data.replacement != ShaderReplacement.Standard || SystemInfo.supportedRenderTargetCount < 3);

                //Get render texture/s
                GetTextures(Camera, customCamera, Data, renderMaskSeperate);

                //Render into textures
                if (VRSettings.enabled && Settings.SinglePassVR && Camera.stereoEnabled)
                {
                    //Left eye
                    if (Camera.stereoTargetEye == StereoTargetEyeMask.Both || Camera.stereoTargetEye == StereoTargetEyeMask.Left)
                    {
                        //Rect
                        customCamera.rect = new Rect(0, 0, 0.5f, 1);

                        //Position & rotation
                        customCamera.transform.position = Camera.transform.parent.TransformPoint(InputTracking.GetLocalPosition(VRNode.LeftEye));
                        customCamera.transform.rotation = Camera.transform.rotation * InputTracking.GetLocalRotation(VRNode.LeftEye);

                        //Projection matrix
                        customCamera.projectionMatrix = Camera.GetStereoProjectionMatrix(Camera.StereoscopicEye.Left);

                        //View matrix
                        Matrix4x4 worldToCamera = Camera.worldToCameraMatrix;
                        customCamera.worldToCameraMatrix = worldToCamera;

                        //Render
                        RenderToTextures(customCamera, Data, Camera.cullingMask, renderMaskSeperate);
                    }

                    //Right eye
                    if (Camera.stereoTargetEye == StereoTargetEyeMask.Both || Camera.stereoTargetEye == StereoTargetEyeMask.Right)
                    {
                        //Rect
                        customCamera.rect = new Rect(0.5f, 0, 0.5f, 1);

                        //Position & rotation
                        customCamera.transform.position = Camera.transform.parent.TransformPoint(InputTracking.GetLocalPosition(VRNode.RightEye));
                        customCamera.transform.rotation = Camera.transform.rotation * InputTracking.GetLocalRotation(VRNode.RightEye);

                        //Projection matrix
                        customCamera.projectionMatrix = Camera.GetStereoProjectionMatrix(Camera.StereoscopicEye.Right);

                        //View matrix
                        Matrix4x4 worldToCamera = Camera.worldToCameraMatrix;
                        worldToCamera.m03 -= Camera.stereoSeparation;
                        customCamera.worldToCameraMatrix = worldToCamera;

                        //Render
                        RenderToTextures(customCamera, Data, Camera.cullingMask, renderMaskSeperate);
                    }
                }
                else
                {
                    customCamera.rect = FullRect;
                    RenderToTextures(customCamera, Data, Camera.cullingMask, renderMaskSeperate);
                }

                //Set completed render texture/s as global shader buffers
                SetAsBuffers(Data);

                //Tell camera to stop rendering to render texture/s
                customCamera.targetTexture = null;
            }
        }