Skip to content

Instantly share code, notes, and snippets.

@3DI70R
Created May 9, 2020 19:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 3DI70R/7ce7fa8b10ac02cc430d7db7dfe7d692 to your computer and use it in GitHub Desktop.
Save 3DI70R/7ce7fa8b10ac02cc430d7db7dfe7d692 to your computer and use it in GitHub Desktop.
using UnityEngine;
public class MaskPainter : MonoBehaviour
{
private const int DeformPassId = 0;
private const int FlattenPassId = 1;
private const int PaintPassId = 2;
private const int PostprocessDepthPassId = 3;
public Camera renderCamera;
public int maskResolution = 256;
public ComputeShader maskPainterShader;
public Texture maskIntialDepth;
public Material maskMaterial;
public float flattenSpeed;
public LayerMask paintCullingMask;
public LayerMask flattenCullingMask;
public LayerMask deformCullingMask;
public LayerMask softEffectMask;
public Color paintColor = Color.red;
public RenderTexture paintDepthRenderTexture;
public RenderTexture flattenDepthRenderTexture;
public RenderTexture deformDepthRenderTexture;
public RenderTexture effectDepthRenderTexture;
private RenderTexture maskDepthTexture;
private RenderTexture maskDepthPostprocessTexture;
private RenderTexture maskColorTexture;
private void Awake()
{
paintDepthRenderTexture = new RenderTexture(maskResolution, maskResolution, 24, RenderTextureFormat.Depth);
flattenDepthRenderTexture = new RenderTexture(maskResolution, maskResolution, 24, RenderTextureFormat.Depth);
deformDepthRenderTexture = new RenderTexture(maskResolution, maskResolution, 24, RenderTextureFormat.Depth);
effectDepthRenderTexture = new RenderTexture(maskResolution, maskResolution, 24, RenderTextureFormat.Depth);
maskDepthTexture = new RenderTexture(maskResolution, maskResolution, 24, RenderTextureFormat.ARGB32);
maskDepthPostprocessTexture = new RenderTexture(maskResolution, maskResolution, 24, RenderTextureFormat.ARGB32);
maskDepthTexture.enableRandomWrite = true;
maskDepthPostprocessTexture.enableRandomWrite = true;
maskDepthPostprocessTexture.Create();
effectDepthRenderTexture.Create();
deformDepthRenderTexture.Create();
renderCamera.depthTextureMode = DepthTextureMode.Depth;
renderCamera.enabled = false;
maskPainterShader.SetInt("depthWidth", maskResolution);
maskPainterShader.SetInt("depthHeight", maskResolution);
// Should be in sync with mask position and material settings
maskPainterShader.SetFloat("zNear", 0.10f / renderCamera.farClipPlane);
maskPainterShader.SetFloat("zSize", renderCamera.farClipPlane - renderCamera.nearClipPlane);
BindTextureToKernels("PaintDepthTexture", paintDepthRenderTexture);
BindTextureToKernels("FlattenDepthTexture", flattenDepthRenderTexture);
BindTextureToKernels("DeformDepthTexture", deformDepthRenderTexture);
BindTextureToKernels("EffectDepthTexture", effectDepthRenderTexture);
BindTextureToKernels("MaskDepthTexture", maskDepthTexture);
BindTextureToKernels("MaskDepthPostprocessTexture", maskDepthPostprocessTexture);
maskMaterial.SetTexture("_HeightMap", maskDepthPostprocessTexture);
ResetColorTexture();
}
public void ResetMask()
{
Graphics.Blit(maskIntialDepth, maskDepthTexture);
ResetColorTexture();
}
private void ResetColorTexture()
{
Destroy(maskColorTexture);
maskColorTexture = new RenderTexture(maskResolution, maskResolution, 24, RenderTextureFormat.ARGB32);
maskColorTexture.enableRandomWrite = true;
maskColorTexture.Create();
BindTextureToKernels("MaskColorTexture", maskColorTexture);
maskMaterial.SetTexture("_ColorMap", maskColorTexture);
}
private void BindTextureToKernels(string name, RenderTexture tex)
{
var id = Shader.PropertyToID(name);
maskPainterShader.SetTexture(DeformPassId, id, tex);
maskPainterShader.SetTexture(FlattenPassId, id, tex);
maskPainterShader.SetTexture(PaintPassId, id, tex);
maskPainterShader.SetTexture(PostprocessDepthPassId, id, tex);
}
private void DispatchKernel(int kernelId)
{
maskPainterShader.Dispatch(kernelId,
Mathf.CeilToInt(maskResolution / 8f),
Mathf.CeilToInt(maskResolution / 8f),
1);
}
private void LateUpdate()
{
UpdateShaderParams();
PaintMask();
DeformMask();
FlattenMask();
PostprocessMask();
}
private void UpdateShaderParams()
{
maskPainterShader.SetFloat("flattenSpeed", Time.deltaTime * flattenSpeed);
maskPainterShader.SetFloat("postprocessSpeed", Time.deltaTime * 20f);
maskPainterShader.SetVector("paintColor", paintColor);
}
private void DeformMask()
{
renderCamera.cullingMask = deformCullingMask;
renderCamera.targetTexture = deformDepthRenderTexture;
renderCamera.Render();
DispatchKernel(DeformPassId);
}
private void FlattenMask()
{
renderCamera.cullingMask = flattenCullingMask;
renderCamera.targetTexture = flattenDepthRenderTexture;
renderCamera.Render();
DispatchKernel(FlattenPassId);
}
private void PaintMask()
{
renderCamera.cullingMask = paintCullingMask;
renderCamera.targetTexture = paintDepthRenderTexture;
renderCamera.Render();
DispatchKernel(PaintPassId);
}
private void PostprocessMask()
{
renderCamera.cullingMask = softEffectMask;
renderCamera.targetTexture = effectDepthRenderTexture;
renderCamera.Render();
DispatchKernel(PostprocessDepthPassId);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment