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); }
//Reset public void ResetSettings() { //Reset settings to default values shaderReplacement = ShaderReplacement.Standard; forceForward = false; //Update renderers DynamicDecals.System.UpdateRenderers(); }
private void ReleaseTextures(ShaderReplacement Replacement) { if (depthBuffer != null && depthBuffer.IsCreated()) { RenderTexture.ReleaseTemporary(depthBuffer); } if (normalBuffer != null && normalBuffer.IsCreated()) { RenderTexture.ReleaseTemporary(normalBuffer); } RenderTexture.ReleaseTemporary(maskBuffer); }
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); } }
//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(); }
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; } }
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"); }
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); } }
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; } }
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(); }