You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Driftology/Assets/FastMobileMotionBlur/MotionBlur.cs

86 lines
2.9 KiB
C#

2 months ago
using UnityEngine;
[RequireComponent(typeof(Camera))]
2 months ago
public class MotionBlur : MonoBehaviour
{
[Header("Blur Settings")]
[Range(1, 5)] public int FastFilter = 4;
public float blurSmoothing = 2f;
[Header("Blur Strength Ranges")]
public float minBlurNormal = 0.05f;
public float maxBlurNormal = 0.15f;
public float minBlurNOS = 0.1f;
public float maxBlurNOS = 0.3f;
[Header("References")]
2 months ago
public Material motionBlurMaterial;
public Texture2D mask;
public VehicleController vehicle;
private Camera cam;
private Matrix4x4 previousViewProjection;
private Matrix4x4 viewProj;
private Matrix4x4 currentToPreviousViewProjectionMatrix;
private float smoothedSpeed = 0f;
private static readonly int currentPrevString = Shader.PropertyToID("_CurrentToPreviousViewProjectionMatrix");
private static readonly int distanceString = Shader.PropertyToID("_Distance");
private static readonly int blurStrengthString = Shader.PropertyToID("_BlurStrength");
private static readonly int blurTexString = Shader.PropertyToID("_BlurTex");
2 months ago
void Start()
{
cam = GetComponent<Camera>();
previousViewProjection = cam.projectionMatrix * cam.worldToCameraMatrix;
Shader.SetGlobalTexture("_MaskTex", mask != null ? mask : Texture2D.whiteTexture);
}
void Update()
{
if (vehicle != null)
{
float targetSpeed = Mathf.Clamp01(vehicle.CurrentSpeed / vehicle.MaximumSpeed);
smoothedSpeed = Mathf.Lerp(smoothedSpeed, targetSpeed, Time.deltaTime * blurSmoothing);
}
else
{
smoothedSpeed = Mathf.Lerp(smoothedSpeed, 0f, Time.deltaTime * blurSmoothing);
}
2 months ago
}
private void OnRenderImage(RenderTexture src, RenderTexture dest)
{
viewProj = cam.projectionMatrix * cam.worldToCameraMatrix;
currentToPreviousViewProjectionMatrix = previousViewProjection * viewProj.inverse;
motionBlurMaterial.SetMatrix(currentPrevString, currentToPreviousViewProjectionMatrix);
motionBlurMaterial.SetFloat(distanceString, 1f); // Required
// Choose blur range based on NOS state
float min = vehicle != null && vehicle.nosActive ? minBlurNOS : minBlurNormal;
float max = vehicle != null && vehicle.nosActive ? maxBlurNOS : maxBlurNormal;
float blurStrength = Mathf.Lerp(min, max, smoothedSpeed);
motionBlurMaterial.SetFloat(blurStrengthString, blurStrength);
2 months ago
previousViewProjection = viewProj;
RenderTexture rt = RenderTexture.GetTemporary(
Screen.width / FastFilter,
Screen.height / FastFilter,
0,
src.format
);
2 months ago
Graphics.Blit(src, rt, motionBlurMaterial, 0);
motionBlurMaterial.SetTexture(blurTexString, rt);
RenderTexture.ReleaseTemporary(rt);
Graphics.Blit(src, dest, motionBlurMaterial, 1);
2 months ago
}
}