小地图毒圈遮罩挖洞的实现

本文介绍了在NGUI中实现小地图毒圈遮罩效果时遇到的问题,即在不同分辨率下,相同半径的圆洞大小不一致。作者尝试通过传入圆心和半径到shader进行裁剪,但未能解决分辨率适配问题。最终,作者采用传入圆心和圆上任意一点的世界坐标来计算半径,成功实现了分辨率无关的裁剪效果。文章强调了在时间紧迫的情况下,灵活变换思路解决问题的重要性。
摘要由CSDN通过智能技术生成
										NGUI在图片上挖洞

小地图毒圈遮罩挖洞的实现

要实现的效果就是在一张图片上以任意圆心和半径为圆,挖一个圆形的洞


最开始想到的方法是传入shader一个圆心的世界坐标和半径,然后判断和圆心距离小于半径的点就舍弃。实现后发现,NGUI中在传入半径相同的情况下,在不同分辨率下挖洞的大小会不一样,这是不行的,在尝试了一些适配方法后,没能解决,由于时间原因,没能继续深入研究不同分辨率和传入shader的半径的对应比例关系。在这里如果有知道的,或有解决方法的希望不吝赐教。

值得一提的是,在UGUI下测试,没有这个问题,不同的屏幕分辨率对应的挖空的大小是不变的。最终NGUI下我采用了另外一种思路,传入shader一个圆心的世界坐标和圆上任意一点的世界坐标,根据这两个点计算出半径,在进行裁剪,这样在不同分辨率下被挖空的圆的大小就不会变了。


第一种方法的关键代码:

v2f vert (appdata v)

{
   v2f o;
   o.vertex = UnityObjectToClipPos(v.vertex);
   o.worldPos = mul(unity_ObjectToWorld, v.vertex);
   o.uv = TRANSFORM_TEX(v.uv, _MainTex);
   o.color = v.color;
   return o;
}

fixed4 frag (v2f i) : SV_Target
{
   float2 center = float2(i.worldPos.x,i.worldPos.y) - float2(_Center1.x, _Center1.y);
   float dis = sqrt(center.x * center.x + center.y * center.y);
   clip(dis - _Radius1);
   fixed4 col = tex2D(_MainTex, i.uv) * i.color;
   return col;
}

第二种也是最终的实现方法的关键代码:

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

fixed4 frag (v2f i) : SV_Target
{
   float2 center = float2(i.worldPos.x, i.worldPos.y) - float2(_Center1.x, _Center1.y);
   float dis = sqrt(center.x * center.x + center.y * center.y);

   float radius = distance(_Center1, _Center2);
   clip(dis - radius);

   fixed4 col = tex2D(_MainTex, i.uv) * i.color;
   return col;
}

然后c#中传入两点的世界坐标即可。世界坐标的获取方法,首先把真实场景中安全区的圆心safePoint转换成小地图上对应的坐标localPos,然后用小地图的transform.TransformPoint(localPos)把相对于小地的本地坐标转换成世界坐标center,最后把世界坐标传入shader中

_bgMask.material.SetVector("_Center1", center);

效果图


总结

牢骚与感慨:作为程序员深入了解并探索问题的本质是必须的,这有助于我们技术的进步。但是在工作中时间排期紧迫的情况下,换一种思路有可能会更容易实现我们的需求,同时也避免了处理其他复杂的情况。所以最后我还是想提出上面提到的这个问题:如何解决不同分辨率下,NGUI中传入shader相同的半径值,但是裁剪的圆的大小不一样的问题。


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值