主要总结动态拼图的其中2个关键点
1.如何实现一个边缘不是锯齿的遮罩
2.如何实现对动态内容的遮罩
针对第一点,unity原生提供的sprite mask是用模板缓冲测试来实现的遮罩,当遮罩图某个像素的alpha低于某个阈值(默认是0.2),就认为这个像素不可见,所以最终遮罩出来的效果是个没有过渡的边缘,看起来锯齿感就很强烈。百度或者google搜索能找到的平滑边缘的解决方案是一个叫做alpha mask的解决方案,原理是用遮罩图片的alpha值来做最后的颜色输出的alpha部分。网上找到的代码是适用于原始图和遮罩图一样大的,但是拼图游戏里面原始图是完整的,遮罩图通常很小,所以我适当做了下修改。
Shader "Unlit/AlphaMask" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_AlphaTex ("Alpha mask (R)", 2D) = "white" {}
}
SubShader {
Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
LOD 100
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#