HeavenStudio/Assets/PostProcessingOutlines/PostProcessOutline.cs
2022-03-10 05:45:21 -07:00

42 lines
2.6 KiB
C#

using System;
using UnityEngine;
using UnityEngine.Rendering.PostProcessing;
[Serializable]
[PostProcess(typeof(PostProcessOutlineRenderer), PostProcessEvent.BeforeStack, "Roystan/Post Process Outline")]
public sealed class PostProcessOutline : PostProcessEffectSettings
{
[Tooltip("Number of pixels between samples that are tested for an edge. When this value is 1, tested samples are adjacent.")]
public IntParameter scale = new IntParameter { value = 1 };
public ColorParameter color = new ColorParameter { value = Color.white };
[Tooltip("Difference between depth values, scaled by the current depth, required to draw an edge.")]
public FloatParameter depthThreshold = new FloatParameter { value = 1.5f };
[Range(0, 1), Tooltip("The value at which the dot product between the surface normal and the view direction will affect " +
"the depth threshold. This ensures that surfaces at right angles to the camera require a larger depth threshold to draw " +
"an edge, avoiding edges being drawn along slopes.")]
public FloatParameter depthNormalThreshold = new FloatParameter { value = 0.5f };
[Tooltip("Scale the strength of how much the depthNormalThreshold affects the depth threshold.")]
public FloatParameter depthNormalThresholdScale = new FloatParameter { value = 7 };
[Range(0, 1), Tooltip("Larger values will require the difference between normals to be greater to draw an edge.")]
public FloatParameter normalThreshold = new FloatParameter { value = 0.4f };
}
public sealed class PostProcessOutlineRenderer : PostProcessEffectRenderer<PostProcessOutline>
{
public override void Render(PostProcessRenderContext context)
{
var sheet = context.propertySheets.Get(Shader.Find("Hidden/Roystan/Outline Post Process"));
sheet.properties.SetFloat("_Scale", settings.scale);
sheet.properties.SetColor("_Color", settings.color);
sheet.properties.SetFloat("_DepthThreshold", settings.depthThreshold);
sheet.properties.SetFloat("_DepthNormalThreshold", settings.depthNormalThreshold);
sheet.properties.SetFloat("_DepthNormalThresholdScale", settings.depthNormalThresholdScale);
sheet.properties.SetFloat("_NormalThreshold", settings.normalThreshold);
sheet.properties.SetColor("_Color", settings.color);
Matrix4x4 clipToView = GL.GetGPUProjectionMatrix(context.camera.projectionMatrix, true).inverse;
sheet.properties.SetMatrix("_ClipToView", clipToView);
context.command.BlitFullscreenTriangle(context.source, context.destination, sheet, 0);
}
}