mirror of
https://github.com/maxartz15/InteractiveMask.git
synced 2024-12-22 15:18:30 +01:00
MaskRenderer
This commit is contained in:
parent
09bc6a90e7
commit
a8c303bd0e
193
Runtime/MaskRenderer.cs
Normal file
193
Runtime/MaskRenderer.cs
Normal file
@ -0,0 +1,193 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace TAO.InteractiveMask
|
||||
{
|
||||
public class MaskRenderer : MonoBehaviour
|
||||
{
|
||||
public Mode mode = Mode.EachFrame;
|
||||
|
||||
public Shader clearBlit = null;
|
||||
private Material clearBlitMaterial;
|
||||
// Camera source.
|
||||
public RenderTexture source = null;
|
||||
// Output target.
|
||||
public RenderTexture target = null;
|
||||
|
||||
public Layer[] layers;
|
||||
|
||||
public bool debugGui = false;
|
||||
|
||||
public void Awake()
|
||||
{
|
||||
clearBlitMaterial = new Material(clearBlit);
|
||||
|
||||
foreach (Layer layer in layers)
|
||||
{
|
||||
layer.Init(source, target);
|
||||
}
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
if (mode == Mode.EachFrame)
|
||||
{
|
||||
Render();
|
||||
}
|
||||
}
|
||||
|
||||
public void Render()
|
||||
{
|
||||
Graphics.Blit(target, target, clearBlitMaterial);
|
||||
|
||||
foreach (Layer layer in layers)
|
||||
{
|
||||
layer.Blit(source, target);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnValidate()
|
||||
{
|
||||
if (clearBlit == null)
|
||||
{
|
||||
clearBlit = Shader.Find("TAO/InteractiveMask/Clear");
|
||||
}
|
||||
|
||||
if (layers != null)
|
||||
{
|
||||
for (int i = 0; i < layers.Length; i++)
|
||||
{
|
||||
if (layers[i].blit == null)
|
||||
{
|
||||
layers[i].blit = Shader.Find("TAO/InteractiveMask/Add");
|
||||
}
|
||||
|
||||
if (layers[i].persistentBlit == null)
|
||||
{
|
||||
layers[i].persistentBlit = Shader.Find("TAO/InteractiveMask/AddPersistent");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void OnGUI()
|
||||
{
|
||||
if (debugGui)
|
||||
{
|
||||
using (new GUILayout.HorizontalScope())
|
||||
{
|
||||
GUITexture(source);
|
||||
GUITexture(target);
|
||||
|
||||
foreach (var l in layers)
|
||||
{
|
||||
switch (l.type)
|
||||
{
|
||||
case Layer.Type.Clear:
|
||||
break;
|
||||
case Layer.Type.Persistent:
|
||||
{
|
||||
GUITexture(l.PersistentTarget);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void GUITexture(Texture texture)
|
||||
{
|
||||
using (new GUILayout.VerticalScope())
|
||||
{
|
||||
GUILayout.Label(texture, GUILayout.Width(256), GUILayout.Height(256));
|
||||
GUILayout.Label(string.Format("{0}\n{1}x{2}\n{3}", texture.name, texture.width, texture.height, texture.graphicsFormat));
|
||||
}
|
||||
}
|
||||
|
||||
public enum Mode
|
||||
{
|
||||
EachFrame,
|
||||
Manual
|
||||
}
|
||||
}
|
||||
|
||||
[System.Serializable]
|
||||
public class Layer
|
||||
{
|
||||
public static int LayerCount = 0;
|
||||
|
||||
public Type type;
|
||||
public Shader blit;
|
||||
private Material blitMaterial;
|
||||
public Vector4 channels;
|
||||
|
||||
// Only when mode is persistent.
|
||||
public Shader persistentBlit;
|
||||
public RenderTexture PersistentTarget
|
||||
{
|
||||
get; private set;
|
||||
}
|
||||
private Material persistentBlitMaterial;
|
||||
|
||||
public void Init(RenderTexture source, RenderTexture target)
|
||||
{
|
||||
blitMaterial = new Material(blit);
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case Type.Clear:
|
||||
break;
|
||||
case Type.Persistent:
|
||||
{
|
||||
persistentBlitMaterial = new Material(persistentBlit);
|
||||
|
||||
if (PersistentTarget == null)
|
||||
{
|
||||
PersistentTarget = new RenderTexture(target)
|
||||
{
|
||||
name = LayerCount.ToString()
|
||||
};
|
||||
LayerCount++;
|
||||
}
|
||||
|
||||
persistentBlitMaterial.SetTexture("_Source", source);
|
||||
persistentBlitMaterial.SetTexture("_Persistent", PersistentTarget);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
blitMaterial.SetTexture("_Source", source);
|
||||
blitMaterial.SetVector("_Channels", channels);
|
||||
}
|
||||
|
||||
public void Blit(RenderTexture source, RenderTexture target)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case Type.Clear:
|
||||
{
|
||||
Graphics.Blit(source, target, blitMaterial);
|
||||
}
|
||||
break;
|
||||
case Type.Persistent:
|
||||
{
|
||||
Graphics.Blit(source, PersistentTarget, persistentBlitMaterial);
|
||||
Graphics.Blit(PersistentTarget, target, blitMaterial);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public enum Type
|
||||
{
|
||||
Clear,
|
||||
Persistent
|
||||
}
|
||||
}
|
||||
}
|
11
Runtime/MaskRenderer.cs.meta
Normal file
11
Runtime/MaskRenderer.cs.meta
Normal file
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c7ace5587b33c154490f78c11ec9a297
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
8
Runtime/Shaders.meta
Normal file
8
Runtime/Shaders.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ad86bba476a81e942aef62ebcad19e59
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
62
Runtime/Shaders/Add.shader
Normal file
62
Runtime/Shaders/Add.shader
Normal file
@ -0,0 +1,62 @@
|
||||
Shader "TAO/InteractiveMask/Add"
|
||||
{
|
||||
Properties
|
||||
{
|
||||
[HideInInspector] [NoScaleOffset] _MainTex("main", 2D) = "white" {}
|
||||
_Channels("Channels", Vector) = (1, 1, 1, 1)
|
||||
}
|
||||
|
||||
SubShader
|
||||
{
|
||||
Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }
|
||||
Blend One One
|
||||
|
||||
Pass
|
||||
{
|
||||
HLSLPROGRAM
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
|
||||
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
|
||||
|
||||
struct Attributes
|
||||
{
|
||||
float4 positionOS : POSITION;
|
||||
float2 uv : TEXCOORD0;
|
||||
};
|
||||
|
||||
struct Varyings
|
||||
{
|
||||
float4 positionHCS : SV_POSITION;
|
||||
float2 uv : TEXCOORD0;
|
||||
};
|
||||
|
||||
TEXTURE2D(_MainTex);
|
||||
SAMPLER(sampler_MainTex);
|
||||
float4 _Channels;
|
||||
|
||||
CBUFFER_START(UnityPerMaterial)
|
||||
float4 _MainTex_ST;
|
||||
CBUFFER_END
|
||||
|
||||
Varyings vert(Attributes IN)
|
||||
{
|
||||
Varyings OUT;
|
||||
|
||||
OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
|
||||
|
||||
OUT.uv = TRANSFORM_TEX(IN.uv, _MainTex);
|
||||
|
||||
return OUT;
|
||||
}
|
||||
|
||||
half4 frag(Varyings IN) : SV_Target
|
||||
{
|
||||
half4 color = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, IN.uv) * _Channels;
|
||||
return color;
|
||||
}
|
||||
|
||||
ENDHLSL
|
||||
}
|
||||
}
|
||||
}
|
10
Runtime/Shaders/Add.shader.meta
Normal file
10
Runtime/Shaders/Add.shader.meta
Normal file
@ -0,0 +1,10 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b56b79d9c9a85fb45bf1a263d73bd938
|
||||
ShaderImporter:
|
||||
externalObjects: {}
|
||||
defaultTextures: []
|
||||
nonModifiableTextures: []
|
||||
preprocessorOverride: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
63
Runtime/Shaders/AddPersistent.shader
Normal file
63
Runtime/Shaders/AddPersistent.shader
Normal file
@ -0,0 +1,63 @@
|
||||
Shader "TAO/InteractiveMask/AddPersistent"
|
||||
{
|
||||
Properties
|
||||
{
|
||||
[HideInInspector] [NoScaleOffset] _MainTex("main", 2D) = "white" {}
|
||||
[NoScaleOffset] _Persistent("persistent", 2D) = "white" {}
|
||||
}
|
||||
|
||||
SubShader
|
||||
{
|
||||
Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }
|
||||
Blend One One
|
||||
|
||||
Pass
|
||||
{
|
||||
HLSLPROGRAM
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
|
||||
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
|
||||
|
||||
struct Attributes
|
||||
{
|
||||
float4 positionOS : POSITION;
|
||||
float2 uv : TEXCOORD0;
|
||||
};
|
||||
|
||||
struct Varyings
|
||||
{
|
||||
float4 positionHCS : SV_POSITION;
|
||||
float2 uv : TEXCOORD0;
|
||||
};
|
||||
|
||||
TEXTURE2D(_MainTex);
|
||||
SAMPLER(sampler_MainTex);
|
||||
TEXTURE2D(_Persistent);
|
||||
SAMPLER(sampler_Persistent);
|
||||
|
||||
CBUFFER_START(UnityPerMaterial)
|
||||
float4 _MainTex_ST;
|
||||
CBUFFER_END
|
||||
|
||||
Varyings vert(Attributes IN)
|
||||
{
|
||||
Varyings OUT;
|
||||
|
||||
OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
|
||||
|
||||
OUT.uv = TRANSFORM_TEX(IN.uv, _MainTex);
|
||||
|
||||
return OUT;
|
||||
}
|
||||
|
||||
half4 frag(Varyings IN) : SV_Target
|
||||
{
|
||||
half4 color = SAMPLE_TEXTURE2D(_Persistent, sampler_Persistent, IN.uv) + SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, IN.uv);
|
||||
return color;
|
||||
}
|
||||
|
||||
ENDHLSL
|
||||
}
|
||||
}
|
||||
}
|
10
Runtime/Shaders/AddPersistent.shader.meta
Normal file
10
Runtime/Shaders/AddPersistent.shader.meta
Normal file
@ -0,0 +1,10 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 794c349d1ba10d34c86b6dd5c2b8bb7e
|
||||
ShaderImporter:
|
||||
externalObjects: {}
|
||||
defaultTextures: []
|
||||
nonModifiableTextures: []
|
||||
preprocessorOverride: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
58
Runtime/Shaders/Clear.shader
Normal file
58
Runtime/Shaders/Clear.shader
Normal file
@ -0,0 +1,58 @@
|
||||
Shader "TAO/InteractiveMask/Clear"
|
||||
{
|
||||
Properties
|
||||
{
|
||||
[HideInInspector] [NoScaleOffset] _MainTex("main", 2D) = "white" {}
|
||||
}
|
||||
|
||||
SubShader
|
||||
{
|
||||
Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }
|
||||
|
||||
Pass
|
||||
{
|
||||
HLSLPROGRAM
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
|
||||
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
|
||||
|
||||
struct Attributes
|
||||
{
|
||||
float4 positionOS : POSITION;
|
||||
float2 uv : TEXCOORD0;
|
||||
};
|
||||
|
||||
struct Varyings
|
||||
{
|
||||
float4 positionHCS : SV_POSITION;
|
||||
float2 uv : TEXCOORD0;
|
||||
};
|
||||
|
||||
TEXTURE2D(_MainTex);
|
||||
SAMPLER(sampler_MainTex);
|
||||
|
||||
CBUFFER_START(UnityPerMaterial)
|
||||
float4 _MainTex_ST;
|
||||
CBUFFER_END
|
||||
|
||||
Varyings vert(Attributes IN)
|
||||
{
|
||||
Varyings OUT;
|
||||
|
||||
OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
|
||||
|
||||
OUT.uv = TRANSFORM_TEX(IN.uv, _MainTex);
|
||||
|
||||
return OUT;
|
||||
}
|
||||
|
||||
half4 frag(Varyings IN) : SV_Target
|
||||
{
|
||||
return half4(0, 0, 0, 0);
|
||||
}
|
||||
|
||||
ENDHLSL
|
||||
}
|
||||
}
|
||||
}
|
10
Runtime/Shaders/Clear.shader.meta
Normal file
10
Runtime/Shaders/Clear.shader.meta
Normal file
@ -0,0 +1,10 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 612652bd41e196b408fe733989b1d223
|
||||
ShaderImporter:
|
||||
externalObjects: {}
|
||||
defaultTextures: []
|
||||
nonModifiableTextures: []
|
||||
preprocessorOverride: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
8
Runtime/Textures.meta
Normal file
8
Runtime/Textures.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 09c1b73271dc0944dad462995cae5ca7
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
38
Runtime/Textures/Source.renderTexture
Normal file
38
Runtime/Textures/Source.renderTexture
Normal file
@ -0,0 +1,38 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!84 &8400000
|
||||
RenderTexture:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: Source
|
||||
m_ImageContentsHash:
|
||||
serializedVersion: 2
|
||||
Hash: 00000000000000000000000000000000
|
||||
m_ForcedFallbackFormat: 4
|
||||
m_DownscaleFallback: 0
|
||||
m_IsAlphaChannelOptional: 0
|
||||
serializedVersion: 3
|
||||
m_Width: 256
|
||||
m_Height: 256
|
||||
m_AntiAliasing: 1
|
||||
m_MipCount: -1
|
||||
m_DepthFormat: 0
|
||||
m_ColorFormat: 8
|
||||
m_MipMap: 0
|
||||
m_GenerateMips: 1
|
||||
m_SRGB: 0
|
||||
m_UseDynamicScale: 0
|
||||
m_BindMS: 0
|
||||
m_EnableCompatibleFormat: 1
|
||||
m_TextureSettings:
|
||||
serializedVersion: 2
|
||||
m_FilterMode: 1
|
||||
m_Aniso: 0
|
||||
m_MipBias: 0
|
||||
m_WrapU: 1
|
||||
m_WrapV: 1
|
||||
m_WrapW: 1
|
||||
m_Dimension: 2
|
||||
m_VolumeDepth: 1
|
8
Runtime/Textures/Source.renderTexture.meta
Normal file
8
Runtime/Textures/Source.renderTexture.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1100058e32530e546a7ae167f97c11c5
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 8400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
38
Runtime/Textures/Target.renderTexture
Normal file
38
Runtime/Textures/Target.renderTexture
Normal file
@ -0,0 +1,38 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!84 &8400000
|
||||
RenderTexture:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: Target
|
||||
m_ImageContentsHash:
|
||||
serializedVersion: 2
|
||||
Hash: 00000000000000000000000000000000
|
||||
m_ForcedFallbackFormat: 4
|
||||
m_DownscaleFallback: 0
|
||||
m_IsAlphaChannelOptional: 0
|
||||
serializedVersion: 3
|
||||
m_Width: 256
|
||||
m_Height: 256
|
||||
m_AntiAliasing: 1
|
||||
m_MipCount: -1
|
||||
m_DepthFormat: 0
|
||||
m_ColorFormat: 8
|
||||
m_MipMap: 0
|
||||
m_GenerateMips: 1
|
||||
m_SRGB: 0
|
||||
m_UseDynamicScale: 0
|
||||
m_BindMS: 0
|
||||
m_EnableCompatibleFormat: 1
|
||||
m_TextureSettings:
|
||||
serializedVersion: 2
|
||||
m_FilterMode: 1
|
||||
m_Aniso: 0
|
||||
m_MipBias: 0
|
||||
m_WrapU: 1
|
||||
m_WrapV: 1
|
||||
m_WrapW: 1
|
||||
m_Dimension: 2
|
||||
m_VolumeDepth: 1
|
8
Runtime/Textures/Target.renderTexture.meta
Normal file
8
Runtime/Textures/Target.renderTexture.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6dbf8770b857bc143a3ebf8ac17ff43a
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 8400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Loading…
Reference in New Issue
Block a user