unity中使用另一个遮罩方案解决mask组件的锯齿现象 | 乐文库-凯发k8官网下载客户端

本文分享unity中使用另一个遮罩方案解决mask组件的锯齿现象 动机

在上一篇文章中, 细心的同学可能看到了, 放大头像后可以看到明显的锯齿, 如图:

这是因为模板测试是按照像素来测试, 要么通过, 要么不通过, 不通过就不给渲染, 那些过渡的地方因为不透明度比较高, 混合的效果与没有混合差不多.

我们使用另一个思路来制作遮罩: 绘制图片时, 从遮罩纹理中采样透明度来修改片元的透明度, 遮罩的圆形之外的部分透明度为0, 该过度的地方也有不同透明度, 这样就能正确混合也能正确起到遮罩的效果.

过程和效果

与上篇文章一样, 我们需要准备两张图片, 一张圆形的半透图片当做遮罩, 一张头像图片. 如图两张图片:

创建一个材质和一个shader(直接复制unity的ui-default做修改), 如下:

custommask2.shaderobject2.mat

对应的shader代码为:

shader "custom/custommask2"{properties{[perrendererdata] _maintex ("sprite texture", 2d) = "white" {}_masktex ("mask texture", 2d) = "white" {}_color ("tint", color) = (1,1,1,1)_colormask ("color mask", range(0, 15)) = 15[toggle(unity_ui_alphaclip)] _useuialphaclip ("use alpha clip", float) = 0}subshader{tags{"queue"="transparent""ignoreprojector"="true""rendertype"="transparent""previewtype"="plane""canusespriteatlas"="true"}cull offlighting offzwrite offztest [unity_guiztestmode]blend srcalpha oneminussrcalphacolormask [_colormask]pass{name "custommask2"cgprogram#pragma vertex vert#pragma fragment frag#pragma target 2.0#include "unitycg.cginc"#include "unityui.cginc"#pragma multi_compile __ unity_ui_alphaclipstruct appdata_t{float4 vertex   : position;float4 color    : color;float2 texcoord : texcoord0;unity_vertex_input_instance_id};struct v2f{float4 vertex   : sv_position;fixed4 color    : color;float2 texcoord  : texcoord0;float4 worldposition : texcoord1;unity_vertex_output_stereo};fixed4 _color;fixed4 _texturesampleadd;float4 _cliprect;v2f vert(appdata_t in){v2f out;unity_setup_instance_id(in);unity_initialize_vertex_output_stereo(out);out.worldposition = in.vertex;out.vertex = unityobjecttoclippos(out.worldposition);out.texcoord = in.texcoord;out.color = in.color * _color;return out;}sampler2d _maintex;sampler2d _masktex;float _oneminussaturability;fixed4 frag(v2f in) : sv_target{half4 color = (tex2d(_maintex, in.texcoord)   _texturesampleadd);if (in.color.r  0.0001 && in.color.b  0.05){float gray = dot(color.rgb, float3(0.2125, 0.7154, 0.0721));color.rgb = lerp(float3(gray, gray, gray), color.rgb, 1 - _oneminussaturability);}}color.a *= unityget2dclipping(in.worldposition.xy, _cliprect);color.a *= tex2d(_masktex, in.texcoord).a;#ifdef unity_ui_alphaclipclip (color.a - 0.001);#endifreturn color;}endcg}}}

与之前的shader相比, 我们删掉了模板测试相关的配置, 添加了一个纹理_masktex (“mask texture”, 2d) = “white” {}, 并增加了一行用来混合透明度的代码color.a *= tex2d(_masktex, in.texcoord).a;.

然后构建两个个rawimage, 大小都设置为120x120, 一个用于显示原图, 一个用于遮罩头像, 如图: 给遮罩头像设置好材质和shader后, 将圆形遮罩的纹理拖到mask texture上, 即可完成所有的工作, 如图:

当然, 也可以通过调节圆形遮罩边缘的透明度来进一步优化边缘的效果. 只要明白是使用透明度混合来解决边缘锯齿问题即可.希望对大家有所帮助.

本文来自网络,不代表乐文库立场,如若转载,请注明出处:https://www.lewenku.com/?p=452307

网站地图