Skip to content

Instantly share code, notes, and snippets.

@unitycoder
Forked from eXponenta/Shader paint
Created October 18, 2021 10:42
Show Gist options
  • Select an option

  • Save unitycoder/e5faa417eb07a686bcdadd80651bc0b7 to your computer and use it in GitHub Desktop.

Select an option

Save unitycoder/e5faa417eb07a686bcdadd80651bc0b7 to your computer and use it in GitHub Desktop.

Revisions

  1. @eXponenta eXponenta created this gist Jun 30, 2017.
    96 changes: 96 additions & 0 deletions Shader paint
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,96 @@
    Shader "Region28/MaskedPaint"
    {
    Properties
    {
    _MainTex ("Main Texture", 2D) = "white" {}
    //_Mask("Mask Texture", 2D) = "white" {}
    _Brush("Brush Texture", 2D) = "white" {}
    [HideInInspector]_BrushPos("Mask Position", Vector) = (0.5,0.5,0.0,0.0)
    _BrushSize("Mask Size", Range(0, 10)) = 1.0
    _BrushRotation("Rotation", Range(0, 360)) = 0
    _BrushTint("Mask Tint", Color) = (1,1,1,1)
    }

    SubShader
    {
    Tags { "RenderType"="Opaque" }
    Cull Off
    ZWrite Off
    ZTest Always

    Pass
    {
    CGPROGRAM
    #pragma vertex vert
    #pragma fragment frag

    #include "UnityCG.cginc"

    struct appdata
    {
    float4 vertex : POSITION;
    float2 uv : TEXCOORD0;
    };

    struct v2f
    {
    float2 uv : TEXCOORD0;
    float4 vertex : SV_POSITION;
    };

    sampler2D _MainTex;
    // sampler2D _Mask;
    sampler2D _Brush;

    float4 _BrushPos;
    float _BrushSize;
    float _BrushRotation;
    float4 _BrushTint;

    float4 _Brush_TexelSize;
    float4 _MainTex_TexelSize;
    float4 _MainTex_ST;

    v2f vert (appdata v)
    {
    v2f o;
    o.vertex = UnityObjectToClipPos(v.vertex);
    o.uv = TRANSFORM_TEX(v.uv, _MainTex);
    return o;
    }

    fixed2 posWithRotation(fixed2 pos) {
    fixed rad = radians(_BrushRotation);
    fixed _s = sin(rad);
    fixed _c = cos(rad);
    float2x2 mat = float2x2(_c, _s, -_s, _c);
    //mat *= 0.5;
    // mat += 0.5;
    //mat = mat * 2 - 1;

    pos -= 0.5;
    pos = mul(pos, mat);
    pos += 0.5;
    return pos;
    }

    fixed4 frag (v2f i) : SV_Target
    {
    fixed4 col = tex2D(_MainTex, i.uv);
    // fixed clip = tex2D(_Mask, i.uv).r;

    fixed scale = (_BrushSize * _Brush_TexelSize.z * _MainTex_TexelSize.x);
    //fixed2 pos = clamp( i.uv - (_MaskPos.xy - 0.5 * scale ) , 0, 1);
    fixed2 pos = i.uv - (_BrushPos.xy - 0.5 * scale);
    pos = posWithRotation(pos / scale);

    fixed4 _maskCol = fixed4(1,1,1,0);
    if(pos.x > 0 && pos.x < 1 && pos.y > 0 && pos.y < 1)
    _maskCol = tex2D(_Brush, pos) * _BrushTint;

    return lerp(col, float4(_maskCol.rgb,1.0), _maskCol.a);
    }
    ENDCG
    }
    }
    }