Beispiel #1
0
        private void GetTextures(Camera OriginalCamera, Camera CustomCamera, ShaderReplacement Replacement)
        {
            //Calculate width and height
            int width  = OriginalCamera.pixelWidth;
            int height = OriginalCamera.pixelHeight;

            if (UnityEngine.XR.XRSettings.enabled && OriginalCamera.stereoTargetEye != StereoTargetEyeMask.None)
            {
                width  = (Settings.SinglePassVR) ? UnityEngine.XR.XRSettings.eyeTextureWidth * 2 : UnityEngine.XR.XRSettings.eyeTextureWidth;
                height = UnityEngine.XR.XRSettings.eyeTextureHeight;
            }

            //Get depth & normal buffers
            if (Replacement == ShaderReplacement.SinglePass)
            {
                depthBuffer  = RenderTexture.GetTemporary(width, height, 24, depthFormat);
                normalBuffer = RenderTexture.GetTemporary(width, height, 0, normalFormat);
            }

            //Get normal buffer
            if (Replacement == ShaderReplacement.DoublePass || Replacement == ShaderReplacement.TriplePass)
            {
                if (OriginalCamera.actualRenderingPath == RenderingPath.DeferredShading)
                {
                    depthBuffer = RenderTexture.GetTemporary(width, height, 24, depthFormat);
                }
                normalBuffer = RenderTexture.GetTemporary(width, height, 24, normalFormat);
            }

            //Get mask buffer
            maskBuffer = RenderTexture.GetTemporary(width, height, (Replacement == ShaderReplacement.TriplePass || Replacement == ShaderReplacement.Classic) ? 24 : 0, maskFormat);
        }
Beispiel #2
0
        //Reset
        public void ResetSettings()
        {
            //Reset settings to default values
            shaderReplacement = ShaderReplacement.Standard;
            forceForward      = false;

            //Update renderers
            DynamicDecals.System.UpdateRenderers();
        }
Beispiel #3
0
 private void ReleaseTextures(ShaderReplacement Replacement)
 {
     if (depthBuffer != null && depthBuffer.IsCreated())
     {
         RenderTexture.ReleaseTemporary(depthBuffer);
     }
     if (normalBuffer != null && normalBuffer.IsCreated())
     {
         RenderTexture.ReleaseTemporary(normalBuffer);
     }
     RenderTexture.ReleaseTemporary(maskBuffer);
 }
Beispiel #4
0
        public void UpdateRenderingMethod(Camera Camera, DynamicDecals System)
        {
            //Determine our rendering method
            if (replacement != System.Settings.shaderReplacement)
            {
                //Update our rendering method
                replacement = System.Settings.shaderReplacement;

                //Add ourself to the new rendering method
                InitializeRenderingMethod(Camera);
            }
        }
Beispiel #5
0
        //Constructor
        public DynamicDecalSettings()
        {
            //Initialize settings with default values
            shaderReplacement = ShaderReplacement.Standard;
            forceForward      = false;

            //Initialize pools with default values
            ResetPools();

            //Initialize masking with default values
            ResetMasking();
        }
Beispiel #6
0
        public void InitializeRenderingMethod(Camera Camera)
        {
            //Scenes cameras always render in high-precision
            if (replacement != ShaderReplacement.SinglePass && (sceneCamera || previewCamera))
            {
                replacement = ShaderReplacement.SinglePass;
            }

            switch (replacement)
            {
            case ShaderReplacement.Classic:
                //Low precision depth & normals
                desiredDTM = DepthTextureMode.DepthNormals;
                SetDepthTextureMode(Camera);
                break;

            case ShaderReplacement.TriplePass:
            case ShaderReplacement.DoublePass:

                if (Camera.actualRenderingPath == RenderingPath.DeferredShading)
                {
                    //Use custom depth, Unity's depth renders too late
                    RestoreDepthTextureMode(Camera);
                }
                else
                {
                    //High precision depth
                    desiredDTM = DepthTextureMode.Depth;
                    SetDepthTextureMode(Camera);
                }

                break;

            case ShaderReplacement.SinglePass:
                //Restore our depth texture mode
                RestoreDepthTextureMode(Camera);
                break;
            }
        }
Beispiel #7
0
        private void SetAsBuffers(Camera OriginalCamera, ShaderReplacement Replacement)
        {
            //Depth-Normal
            if (Replacement == ShaderReplacement.SinglePass)
            {
                depthBuffer.SetGlobalShaderProperty("_CustomDepthTexture");
                normalBuffer.SetGlobalShaderProperty("_CustomNormalTexture");
            }

            //Normal
            if (Replacement == ShaderReplacement.TriplePass || Replacement == ShaderReplacement.DoublePass)
            {
                if (OriginalCamera.actualRenderingPath == RenderingPath.DeferredShading)
                {
                    depthBuffer.SetGlobalShaderProperty("_CustomDepthTexture");
                }
                normalBuffer.SetGlobalShaderProperty("_CustomNormalTexture");
            }

            //Mask buffers
            maskBuffer.SetGlobalShaderProperty("_MaskBuffer_0");
        }
Beispiel #8
0
        public void UpdateRenderingMethod(Camera Camera, DynamicDecals System)
        {
            //Use standard shader replacement by default
            ShaderReplacement shaderReplacement = ShaderReplacement.SinglePass;

            //If we can't render to at least 3 render textures perform shade replacement in 2 passes
            if (SystemInfo.supportedRenderTargetCount < 3)
            {
                shaderReplacement = ShaderReplacement.DoublePass;
            }

            //Android / Mac bug with single pass replacement
            #if (UNITY_STANDALONE_OSX || UNITY_EDITOR_OSX || UNITY_ANDROID)
            shaderReplacement = ShaderReplacement.DoublePass;
            #endif

            //If rendering a VR eye, use VR replacement
            if (UnityEngine.XR.XRSettings.enabled && Camera.stereoTargetEye != StereoTargetEyeMask.None)
            {
                shaderReplacement = ShaderReplacement.TriplePass;
            }

            //If on old device, use mobile replacement
            if (SystemInfo.graphicsShaderLevel <= 20 || SystemInfo.supportedRenderTargetCount < 2)
            {
                shaderReplacement = ShaderReplacement.Classic;
            }

            //Determine our rendering method
            if (replacement != shaderReplacement)
            {
                //Update our rendering method
                replacement = shaderReplacement;

                //Add ourself to the new rendering method
                InitializeRenderingMethod(Camera);
            }
        }
Beispiel #9
0
        public void InitializeRenderingMethod(Camera Camera)
        {
            //Scenes cameras always render in high-precision
            if (replacement != ShaderReplacement.Standard && (sceneCamera || previewCamera))
            {
                replacement = ShaderReplacement.Standard;
            }

            switch (replacement)
            {
            case ShaderReplacement.Mobile:
                //Low precision depth & normals
                desiredDTM = DepthTextureMode.DepthNormals;
                SetDepthTextureMode(Camera);

                //Set replacement shader
                replacementShader = DynamicDecals.System.MaskShader;
                break;

            case ShaderReplacement.VR:
                //Low precision depth & normals
                desiredDTM = DepthTextureMode.Depth;
                SetDepthTextureMode(Camera);

                //Set replacement shader
                replacementShader = DynamicDecals.System.MaskShader;
                break;

            case ShaderReplacement.Standard:
                //Restore our depth texture mode
                RestoreDepthTextureMode(Camera);

                //Set replacement shader
                replacementShader = DynamicDecals.System.DepthNormalMaskShader;
                break;
            }
        }
Beispiel #10
0
        private void RenderToTextures(Camera OriginalCamera, Camera CustomCamera, ShaderReplacement Replacement, RenderTexture depth, RenderTexture normal, RenderTexture mask, LayerMask CullingMask)
        {
            switch (Replacement)
            {
            case ShaderReplacement.Classic:
                //Render to mask buffer
                CustomCamera.targetTexture = mask;
                DrawMaskPasses(CustomCamera, MaskShader, CullingMask);

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

            case ShaderReplacement.TriplePass:
                //Set culling layers
                CustomCamera.cullingMask = CullingMask;

                //Render to depth buffer
                if (OriginalCamera.actualRenderingPath == RenderingPath.DeferredShading)
                {
                    CustomCamera.targetTexture = depth;
                    DrawRegualarPass(CustomCamera, DepthShader);
                }

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

                //Render to mask buffer
                CustomCamera.targetTexture = mask;
                DrawMaskPasses(CustomCamera, MaskShader, CullingMask);

                if (OriginalCamera.actualRenderingPath == RenderingPath.DeferredShading)
                {
                    //Tell shaders to use custom depth/normals
                    Shader.DisableKeyword("_PrecisionDepthNormals");
                    Shader.EnableKeyword("_CustomDepthNormals");
                }
                else
                {
                    //Tell shaders to use precision depth/normals
                    Shader.EnableKeyword("_PrecisionDepthNormals");
                    Shader.DisableKeyword("_CustomDepthNormals");
                }
                break;

            case ShaderReplacement.DoublePass:

                //Render to depth buffer
                if (OriginalCamera.actualRenderingPath == RenderingPath.DeferredShading)
                {
                    CustomCamera.cullingMask   = CullingMask;
                    CustomCamera.targetTexture = depth;
                    DrawRegualarPass(CustomCamera, DepthShader);
                }

                //Render to normal and mask buffers at once
                RenderBuffer[] doublePassBuffers = new RenderBuffer[] { normal.colorBuffer, mask.colorBuffer };
                CustomCamera.SetTargetBuffers(doublePassBuffers, normal.depthBuffer);
                DrawMaskPasses(CustomCamera, NormalMaskShader, CullingMask);

                if (OriginalCamera.actualRenderingPath == RenderingPath.DeferredShading)
                {
                    //Tell shaders to use custom depth/normals
                    Shader.DisableKeyword("_PrecisionDepthNormals");
                    Shader.EnableKeyword("_CustomDepthNormals");
                }
                else
                {
                    //Tell shaders to use precision depth/normals
                    Shader.EnableKeyword("_PrecisionDepthNormals");
                    Shader.DisableKeyword("_CustomDepthNormals");
                }
                break;

            case ShaderReplacement.SinglePass:
                //Render to depth, normal and mask buffers at once
                RenderBuffer[] singlePassBuffers = new RenderBuffer[] { depth.colorBuffer, normal.colorBuffer, mask.colorBuffer };
                CustomCamera.SetTargetBuffers(singlePassBuffers, depth.depthBuffer);
                DrawMaskPasses(CustomCamera, DepthNormalMaskShader, CullingMask);

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

            //Tell camera to stop rendering to render texture/s
            CustomCamera.targetTexture = null;
        }
        //GUI sections
        private void GeneralSettings(Rect Area, DynamicDecalSettings Settings)
        {
            GUI.BeginGroup(Area);

            //Header
            EditorGUI.DrawRect(new Rect(0, 0, Area.width, 24), LlockhamEditorUtility.HeaderColor);
            EditorGUI.LabelField(new Rect(8, 4, Area.width - 32, 16), "Settings", EditorStyles.boldLabel);

            //Reset
            Rect Reset = new Rect(Area.width - 20, 6, 12, 12);

            if (Event.current.type == EventType.mouseDown && Event.current.button == 0 && Reset.Contains(Event.current.mousePosition))
            {
                Undo.RecordObject(Settings, "Reset Settings");
                Settings.ResetSettings();
                Event.current.Use();
            }
            GUI.DrawTexture(Reset, LlockhamEditorUtility.Reset);

            //Draw Background
            EditorGUI.DrawRect(new Rect(0, 24, Area.width, Area.height - 24), LlockhamEditorUtility.MidgroundColor);

            //Begin Layout Area
            GUILayout.BeginArea(new Rect(4, 32, Area.width - 20, Area.height - 32));

            //Shader replacement
            EditorGUI.BeginChangeCheck();
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.LabelField(new GUIContent("Shader Replacement", "Use SinglePass whenever possible, VR is only required for VR and Mobile for older mobile devices (Shader Model 2.0)."), GUILayout.Width(150));
            GUILayout.FlexibleSpace();
            ShaderReplacement shaderReplacement = (ShaderReplacement)EditorGUILayout.EnumPopup(new GUIContent(""), Settings.shaderReplacement, GUILayout.Width(Area.width - 180));

            EditorGUILayout.EndHorizontal();

            if (EditorGUI.EndChangeCheck())
            {
                //Record state for undo
                Undo.RecordObject(Settings, "Shader Replacement");

                //Change forward depth locking
                Settings.shaderReplacement = shaderReplacement;
            }

            //Force forward
            EditorGUI.BeginChangeCheck();
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.LabelField(new GUIContent("Force Forward Rendering", "Force all projections to render in a forward renderloop with the forward shaders. This is useful for keeping all projections in the same priority que (Deferred projections renderer before Forward projections otherwise)."), GUILayout.Width(200));
            GUILayout.FlexibleSpace();
            bool forceForward = EditorGUILayout.Toggle(new GUIContent(""), Settings.forceForward, GUILayout.Width(14));

            EditorGUILayout.EndHorizontal();

            if (EditorGUI.EndChangeCheck())
            {
                //Record state for undo
                Undo.RecordObject(Settings, "Force Forward");

                //Apply changes
                Settings.forceForward = forceForward;

                //Update renderers
                DynamicDecals.System.UpdateRenderers();
            }

            GUILayout.EndArea();
            GUI.EndGroup();
        }