NGUI裁剪粒子的实现,完全仿照原有的NGUI SoftClip逻辑思路,可多层裁剪

这篇博客介绍了如何实现NGUI粒子系统的多层裁剪功能,详细讲解了C#代码和Shader的使用,完全遵循NGUI的SoftClip逻辑。内容包括单层Panel裁剪的Shader以及扩展到两层Panel裁剪的解决方案。
摘要由CSDN通过智能技术生成

参照http://blog.csdn.net/tkokof1/article/details/52107736 这一篇博客

但是他只实现了单层panel的裁剪,虽然他的算法和NGUI的思路是一致的,但是由于传入Shader的值不同,所以不太好移植成多层Panel裁剪。我重新对他的思路进行整理了,并且将值统一为NGUI的规则,传入的值都用_ClipRange0和_ClipArgs0表示。首先是C#端代码

    void UpdateClip(UIPanel panel)
    {
        if (mCam == null) return;
        UIPanel currentPanel = panel;

        Vector4 cr = new Vector4();

        //计算距离最近的父Panel的中心点 这个点存着 如果有多层的话 就可以用panelCenter,这样不需要重复计算了
        var panelWorldCorners1 = panel.worldCorners;
        var leftBottom1 = mCam.WorldToViewportPoint(panelWorldCorners1[0]);
        var topRight1 = mCam.WorldToViewportPoint(panelWorldCorners1[2]);
        var panelCenter = Vector3.Lerp(leftBottom1, topRight1, 0.5f);

        //遍历所有的父Panel(所以支持嵌套的Soft Clip)
        for (int i = 0; currentPanel != null;)
        {
            //如果父Panel节点有裁剪
            if (currentPanel.hasClipping)
            {
                //这个里面计算裁剪范围和父Panel和当前DrawCall所属的Panel的角度
                float angle = 0f;
                //Vector4 cr = currentPanel.drawCallClipRange;

                // 与NGUI逻辑不同的第一处 这里将坐标统一为ViewPort坐标系
                var panelWorldCorners = currentPanel.worldCorners;
                var leftBottom = mCam.WorldToViewportPoint(panelWorldCorners[0]);
                var topRight = mCam.WorldToViewportPoint(panelWorldCorners[2]);
                var center = Vector3.Lerp(leftBottom, topRight, 0.5f);
                cr.x = panelCenter.x;
                cr.y = panelCenter.y;
                cr.z = (topRight.x - leftBottom.x) / 2;
                cr.w = (topRight.y - leftBottom.y) / 2;

                //如果有多重Soft Clip的话 就会走到这里
             
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值