博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实现一个涂抹擦除效果
阅读量:5899 次
发布时间:2019-06-19

本文共 4506 字,大约阅读时间需要 15 分钟。

 

涂抹还是满常见的效果。

要做涂抹,首先要存一张中间贴图作为mask。

然后需要两个shader,一个做mask一个做混合。

 

MaskShader:

Shader "Unlit/MaskShader"{    Properties    {        _MainTex ("Texture", 2D) = "white" {}        _MaskDecalTex("Mask Decal Texture", 2D) = "white" {}        _MaskOffset("Mask Offset", vector) = (0,0,0,0)    }    SubShader    {        Tags { "RenderType"="Opaque" }        LOD 100        Pass        {            CGPROGRAM            #pragma vertex vert            #pragma fragment frag            // make fog work            #pragma multi_compile_fog                        #include "UnityCG.cginc"            struct appdata            {                float4 vertex : POSITION;                float2 uv : TEXCOORD0;            };            struct v2f            {                float2 uv : TEXCOORD0;                float4 vertex : SV_POSITION;            };            sampler2D _MainTex;            float4 _MainTex_ST;            float4 _MaskOffset;            sampler2D _MaskDecalTex;                        v2f vert (appdata v)            {                v2f o;                o.vertex = UnityObjectToClipPos(v.vertex);                o.uv = TRANSFORM_TEX(v.uv, _MainTex);                return o;            }                        fixed4 frag (v2f i) : SV_Target            {                fixed4 r = tex2D(_MainTex, i.uv);#if UNITY_UV_STARTS_AT_TOP                float grabSign = -_ProjectionParams.x;#else                float grabSign = _ProjectionParams.x;#endif                half2 uv = float2(1, grabSign) * (i.uv - half2(0.5, 0.5)) / _MaskOffset.ww + half2(0.5, 0.5);                fixed4 mask = tex2D(_MaskDecalTex, uv + _MaskOffset.xy);                return r + mask;            }            ENDCG        }    }}

 

 

BlendShader:

Shader "Unlit/BlendShader"{    Properties    {        _MainTex ("Texture", 2D) = "white" {}        _SecondTex("Second Texture", 2D) = "white" {}        _MaskTex("Mask Texture", 2D) = "white" {}    }    SubShader    {        Tags { "RenderType"="Opaque" }        LOD 100        Pass        {            CGPROGRAM            #pragma vertex vert            #pragma fragment frag            // make fog work            #pragma multi_compile_fog                        #include "UnityCG.cginc"            struct appdata            {                float4 vertex : POSITION;                float2 uv : TEXCOORD0;            };            struct v2f            {                float2 uv : TEXCOORD0;                float4 vertex : SV_POSITION;            };            sampler2D _MainTex;            float4 _MainTex_ST;            sampler2D _SecondTex;            sampler2D _MaskTex;                        v2f vert (appdata v)            {                v2f o;                o.vertex = UnityObjectToClipPos(v.vertex);                o.uv = TRANSFORM_TEX(v.uv, _MainTex);                return o;            }                        fixed4 frag (v2f i) : SV_Target            {                fixed4 col1 = tex2D(_MainTex, i.uv);                fixed4 col2 = tex2D(_SecondTex, i.uv);#if UNITY_UV_STARTS_AT_TOP                float grabSign = -_ProjectionParams.x;#else                float grabSign = _ProjectionParams.x;#endif                half2 uv = float2(1, grabSign) * (i.uv - half2(0.5, 0.5)) + half2(0.5, 0.5);                fixed4 mask = tex2D(_MaskTex, uv);                return lerp(col1, col2, mask.a);            }            ENDCG        }    }}

 

脚本(核心部分):

Vector4 viewPortPoint = Camera.main.WorldToViewportPoint(maskMappingPoint.position);viewPortPoint -= new Vector4(0.5f, 0.5f);viewPortPoint.w = maskMappingPoint.localScale.x;if (mPersistMaskTex == null){    mPersistMaskTex = new Texture2D(src.width, src.height, TextureFormat.RGBA32, false, true);    for (int x = 0; x < mPersistMaskTex.width; x++)        for (int y = 0; y < mPersistMaskTex.height; y++)            mPersistMaskTex.SetPixel(x, y, new Color(0, 0, 0, 0));    mPersistMaskTex.Apply();}maskMat.SetTexture("_MainTex", mPersistMaskTex);maskMat.SetVector("_MaskOffset", viewPortPoint);Graphics.Blit(mPersistMaskTex, maskRT, maskMat);blendMat.SetTexture("_MainTex", src);blendMat.SetTexture("_SecondTex", tempRT);blendMat.SetTexture("_MaskTex", maskRT);Graphics.Blit(src, des, blendMat);var cacheActive = RenderTexture.active;RenderTexture.active = maskRT;mPersistMaskTex.ReadPixels(new Rect(0, 0, mPersistMaskTex.width, mPersistMaskTex.height), 0, 0);mPersistMaskTex.Apply();RenderTexture.active = cacheActive;

 

2018/11/18补充:近期实现了对涂抹像素的判断操作,涂抹到一定程度后则完成擦除:

转载于:https://www.cnblogs.com/hont/p/7282625.html

你可能感兴趣的文章
查看linux是ubuntu还是centos
查看>>
html video的url更新,自动清缓存
查看>>
IOS Xib使用——为控制器添加Xib文件
查看>>
CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙步骤
查看>>
react 取消 eslint
查看>>
【11】ajax请求后台接口数据与返回值处理js写法
查看>>
Python菜鸟之路:Jquery Ajax的使用
查看>>
LeetCode算法题-Maximum Depth of Binary Tree
查看>>
sha1withRSA算法
查看>>
Vim和操作系统剪贴板交互
查看>>
Cox 教学视频5
查看>>
JVM类加载(4)—加载器
查看>>
public/private/protected的具体区别
查看>>
面试宝典——求一个字符串中连续出现次数最多的子串
查看>>
VMware Workstation虚拟机上网设置
查看>>
Jenkins持续集成学习-搭建jenkins问题汇总
查看>>
C#Note13:如何在C#中调用python
查看>>
Android介绍以及源码编译---Android源码下载
查看>>
SpringBoot集成redis缓存
查看>>
sql经典语句
查看>>