zoukankan      html  css  js  c++  java
  • 糍粑大叔的独游之旅-u3d中2D轮廓的生成(上)

    u3d中2D轮廓的生成(上)

    对于没有美术资源的我,能自动生成的东西,必须靠代码解决。
    网上有很多3D实时轮廓的生成文章,都很有借鉴意义,我也参考了其中很多内容,但这里就不一一列举了。
    而本文的主要区别在于:
    1、对u3d的单一GameObject节点生成轮廓,而非屏幕级
    2、由于(我的)游戏里单位,都是由很多的sprite组合而成,轮廓标记时暂时没有的动画需求,所有可以一次生成,但一个纹理使用,避免了实时绘制,到来太多的消耗

    第一文,争取讲清楚点,所以分多篇讲述。

    技术实现的总体步骤

    1. 准备一个Camera,用来做渲染到纹理(Render To Texture ),以下RTCamera
    2. 根据要生成轮廓的目标(以下简称target)的尺寸,创建一个RenderTexture(以下简称rt)
    3. 保存target的原始位置,并将target移动到一个“非常远”的位置,或通过设置layer的方法,以保证RTCamera里只能绘制target
    4. 设置SolidShader(只绘制白色、无光、无纹理的shader),调用Camera.RenderWithShader渲染到rt
    5. 对rt进行“扩大”处理,即多次进行blur
    6. 移回target到原始位置,并为target添加一个子节点,使用rt作为纹理,并设置绘制shader的颜色

    类结构

    为了更方便的使用,封装成了几个类:

    • EffectRTGenerator,绑在Camera上组建,关键方法:
    public RenderTexture CreateOutterline(GameObject target, float x, float y)

    生成一个rt

    • OutterlineRenderer,轮廓渲染器,作为target的子节点,提供一个静态方法自动生成一个OutterlineRenderer
    public static OutterlineRenderer CreateOutlineRenderer(Unit target)

    其中Unit是游戏的单位.
    在场景中,建立一个camera绑上EffectRTGenerator,在代码中,直接调用OutterlineRenderer 即可创建轮廓,不需要在游戏逻辑中去处理rt、RTCamera,十分方便

    效果示例

    这里写图片描述
    图中间绿点是图片alpha值原因导致
    图中间绿点是图片alpha值原因导致

    下一篇 讲解关键的实现步骤

  • 相关阅读:
    2. Add Two Numbers
    1. Two Sum
    leetcode 213. 打家劫舍 II JAVA
    leetcode 48. 旋转图像 java
    leetcode 45. 跳跃游戏 II JAVA
    leetcode 42. 接雨水 JAVA
    40. 组合总和 II leetcode JAVA
    24. 两两交换链表中的节点 leetcode
    1002. 查找常用字符 leecode
    leetcode 23. 合并K个排序链表 JAVA
  • 原文地址:https://www.cnblogs.com/uncleciba/p/5721354.html
Copyright © 2011-2022 走看看