-
-
Save 3DI70R/7ce7fa8b10ac02cc430d7db7dfe7d692 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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