Notifications
Article
一个可以计算长宽比的圆角切割shader
Updated a month ago
20
0
通过加入长宽比变量进行圆角部分运算,以实现可以计算长宽比的圆角切割
之前因为相关需求,在网上找了相关的2d圆角切割代码。但网上的代码没有对长宽比进行计算,导致如果不是正方形,圆角切割就会切出一个类似椭圆的球的形状。
后来我改了一下,加入了一个长宽比参数,这个样子就可以实现血条这种长条物体的圆角切割了。
Shader "Custom/BloodShader" { Properties{ _MainTex("Base (RGB)", 2D) = "white" {} _RADIUSBUCE("_RADIUSBUCE", Range(0,0.5)) = 0.2 _WidthDevideHeight("WidthDevideHeight", Float) = 16 } SubShader { pass { CGPROGRAM #pragma exclude_renderers gles #pragma vertex vert #pragma fragment frag #include "unitycg.cginc" float _RADIUSBUCE; sampler2D _MainTex; float _WidthDevideHeight; struct v2f { float4 pos : SV_POSITION; float2 ModeUV: TEXCOORD0; float2 RadiusBuceVU : TEXCOORD1; }; v2f vert(appdata_base v) { v2f o; o.pos = UnityObjectToClipPos(v.vertex); //v.vertex; o.ModeUV = v.texcoord; o.RadiusBuceVU = v.texcoord - float2(0.5,0.5); o.RadiusBuceVU.x = o.RadiusBuceVU.x *_WidthDevideHeight; o.RadiusBuceVU.y = o.RadiusBuceVU.y ; return o; } fixed4 frag(v2f i) :COLOR { fixed4 col; col = (0,1,1,0); if(abs(i.RadiusBuceVU.x)<(0.5*_WidthDevideHeight)-_RADIUSBUCE || abs(i.RadiusBuceVU.y)<(0.5 - _RADIUSBUCE)) col = tex2D(_MainTex, i.ModeUV); else { if(length(abs(i.RadiusBuceVU) - float2(0.5*_WidthDevideHeight - _RADIUSBUCE,0.5 - _RADIUSBUCE)) < _RADIUSBUCE) col = tex2D(_MainTex, i.ModeUV); else discard; } return col; } ENDCG } } }
大概原理和普通的圆角切割并无二致,主要在加了一个参数上去。

xindu233
Developer - Student
2
Comments