Unity3D-Shader-人物残影效果

【旧博客转移 - 2016年1月7日 00:24 】

前面的话

上一篇讲了一下人物边缘发光效果,链接: Unity-ShaderLab-实现X光效果,这次我们利用这个Shader来实现人物残影效果

先来看一下效果  →_→

 

大概的原理

  • 创建残影:拷贝人物当前Mesh数据作为残影,用MeshFilter+MeshRenderer渲染出来
  • 残影有生命周期、创建间隔:残影从创建到慢慢消失的过程,这里采用透明度淡出
  • 使用X光Shader
Mesh mesh = new Mesh ();
meshRender[i].BakeMesh(mesh);

 

BakeMesh拷贝网格

 
 

拷贝网格很简单,调用SkinnedMeshRenderer的BakeMesh方法

用MeshFilter跟MeshRenderer渲染网格

MeshFilter filter = go.AddComponent<MeshFilter>();
filter.mesh = mesh;

MeshRenderer meshRen = go.AddComponent<MeshRenderer>();

meshRen.material = meshRender[i].material;
meshRen.material.shader = ghostShader;//设置xray效果

 

MeshFilter:网格过滤器用于从你的资源中获取网格信息(Mesh)并将其传递到用于将其渲染到屏幕的网格渲染器当中

MeshRenderer:但是想要渲染出网格,还需要用到MeshRenderer哦

完整代码

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class GhostShadow : MonoBehaviour {
    //持续时间
    public float duration = 2f;
    //创建新残影间隔
    public float interval = 0.1f;
    
    //边缘颜色强度
    [Range(-1, 2)]
    public float Intension = 1;
    
    //网格数据
    SkinnedMeshRenderer[] meshRender;
    
    //X-ray
    Shader ghostShader;
    
    void Start () {
        //获取身上所有的Mesh
        meshRender = this.gameObject.GetComponentsInChildren<SkinnedMeshRenderer> ();
        
        ghostShader = Shader.Find("lijia/Xray");
    }
    
    private float lastTime = 0;
    
    private Vector3 lastPos = Vector3.zero;
    
    void Update () {
        //人物有位移才创建残影
        if (lastPos == this.transform.position)
        {
            return;
        }
        lastPos = this.transform.position;
        if(Time.time - lastTime < interval){//残影间隔时间
            return;
        }
        lastTime = Time.time;
        
        if (meshRender == null)
            return;
        for (int i = 0; i < meshRender.Length; i++) {
            Mesh mesh = new Mesh ();
            meshRender[i].BakeMesh(mesh);
            
            GameObject go = new GameObject();
            go.hideFlags = HideFlags.HideAndDontSave;
            
            GhostItem item = go.AddComponent<GhostItem>();//控制残影消失
            item.duration = duration;
            item.deleteTime = Time.time + duration;
            
            MeshFilter filter = go.AddComponent<MeshFilter>();
            filter.mesh = mesh;
            
            MeshRenderer meshRen = go.AddComponent<MeshRenderer>();
            
            meshRen.material = meshRender[i].material;
            meshRen.material.shader = ghostShader;//设置xray效果
            meshRen.material.SetFloat("_Intension", Intension);//颜色强度传入shader中
            
            go.transform.localScale = meshRender[i].transform.localScale;
            go.transform.position = meshRender[i].transform.position;
            go.transform.rotation = meshRender[i].transform.rotation;
            
            item.meshRenderer = meshRen;
        }
    }
}

 

GhostItem

using System;
using UnityEngine;

public class GhostItem : MonoBehaviour
{
    //持续时间
    public float duration;
    //销毁时间
    public float deleteTime;
    
    public MeshRenderer meshRenderer;
    
    void Update(){
        float tempTime = deleteTime - Time.time;
        if (tempTime <= 0) {//到时间就销毁
            GameObject.Destroy (this.gameObject);
        } else if(meshRenderer.material){
            float rate = tempTime/duration;//计算生命周期的比例
            Color cal = meshRenderer.material.GetColor("_RimColor");
            cal.a *= rate;//设置透明通道
            meshRenderer.material.SetColor("_RimColor", cal);
        }
        
    }
}

 

最后的话

这篇就写完啦,这种实现方式的优点就是残影可以实时捕捉动作,比较动态。缺点是比较消耗性能,频繁创建网格,相当于要多渲染那么多个人物。

如果有好的的优化思路,欢迎在下面评论

转载于:https://www.cnblogs.com/lijiajia/p/6861454.html

Unity Shader Example 24 (人物遮挡透明效果) Shader "Occlusion" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _Alpha ("Alpha", Range(0.0, 1.0)) = 0.25 } SubShader { Tags { "Queue"="Transparent" "RenderType"="Opaque" } Pass { Z 阅读详情

相关推荐

Unity3D游戏制作(二)——如何渲染3D角色

本系列文章由 Amazonzx 编写,欢迎转载,转载请注明出处。 http://blog.csdn.net/amazonzx/article/details/7935341 本文主要介绍一下如何利用Shader来渲染游戏中的3D角色,以及如何利用Unity提供的Surface Shader来书写自定义Shader。 一、       从Shader开始 1、通过Assets->

游戏点滴 2万+

普通的Shader-物体移动身后的一种实现

思路:在网上看到的一种思路,物体移动时,对移动方向相反的物体顶点进行一个偏移,来实现效果 目前的问题: 目前的顶点偏移是整体偏移,可以添加噪声进行扰动,效果更好一点 偏移后的颜色还可以想办法改一下,颜色 代码: Shader "Mytest/MoveTestShader"{ Properties{ _MainColor("MainColor",Color)=(1,1,1,1) _VertexColor("VertexColor",Color)=(0,0,0,0) _Dir("Dir"

suixinger_lmh的随笔 3106

【虚拟仿真】Unity3D中模型的渐隐渐现效果实现

推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 一、前言 最近项目上要实现一个模型渐隐渐现的效果,研究了一下,分享出来。 这个主要是用到了Shader(但不用学)和DoTween动画插件。 文中示例代码简单明了,感兴趣的小伙伴可以参考一下。 二、效果展示及源码下载 源码下载: https://download.csdn.net/download/q764424567/20079897 三、正文 界面没啥好说的: 代码: .

CSDN博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 6147

Unity3D手游开发日记(8) - 运动效果

2D游戏很简单,美术做序列帧图片就行了,那么3D游戏美术做不了,得靠程序员动态创建模型来处理. 实现原理也很简单: 1.间隔一定时间创建一个模型 2.对模型采用特殊的shader 3.淡入淡出的处理 namespace Luoyinan { public class MotionGhost { public GameObje

LuoyinanRoy的专栏 1万+

Unity 3D中的阴设置

在Unity 3D中,经常需要用到光照阴,即Directional Light的Shadow,Shadow分为Hard Shadow和Soft Shadow。区别是Soft Shadow的阴边缘比较平滑,接近真实,但是性能消耗大于Hard Shadow。   Lightmapping有3种选择:实时光照阴(RealTimeOnly)、场景烘焙阴(BakedOnly)、以及上面两者结合

fang_tang_的专栏 8962

Unity 引擎做效果——1、BakeMesh

在Unity里面做,方法很多,这一篇先介绍最常见的BakeMesh方法。

阿赵的博客 3934

Unity 引擎做效果——2、屏幕后处理方式

这里继续介绍Unity里面做的方法。之前介绍了BakeMesh的方法做,这一期介绍的是用屏幕后处理的方法做

阿赵的博客 2849

Unity3D-Shader-人物效果 [

原文 : http://www.manew.com/thread-106655-1-1.html 这次我们利用人物边缘发光效果来实现人物效果   先来看一下效果  →_→   大概的原理   1、创建:拷贝人物当前Mesh数据作为,用MeshFilter+MeshRenderer渲染出来   2、有生命周期、创建间隔:从创建到慢慢消失的过程

qq_36006719的博客 1872

unity人物模型_Unity 效果

原文链接:【Unity Shader : Ghost() unity unity 移动-教程分享-游戏蛮牛】-游戏出海,ar增强现实,虚拟现实,unity3d,unity3d教程下载首选u3d,unity3d官网1.shader// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld' // Upg...

weixin_39562554的博客 381

unity3d:运动

Shader "Custom/GhostOnly_Transparent" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _GhostColor ("Ghost Color", Color) = (0, 1, 0, 1) _Pow ("Pow Factor", int) = 2 } SubShader ...

Have a nice day. 873

Unity3D 效果

以下脚本需要放在含有&lt;Skinned  Mesh Renderer&gt;组件的物体身上 using UnityEngine; using System.Collections; using System.Collections.Generic; /// &lt;summary&gt; /// 特效 /// &lt;/summary&gt; public class AfterIma...

qq_35636573的博客 853

Unity3D中物体移动拖

两个脚本即可实现 脚本一:获取对象下的skinMeshRenderer或者meshRenderer组件 using UnityEngine; using System.Collections; using System.Collections.Generic; namespace DragonRun { [ExecuteInEditMode] public class PlayerShadow : MonoBehaviour { public Shader cur

qq_43404472的博客 1261

Unity3D-Shader-实现X光效果

【旧博客转移 - 2016年1月3日 16:40】 最近学习了一些Shader效果,打算把学到的知识总结一下,这篇讲一下这种轮廓发光的效果(如下图所示),也有一些地方管这个叫X光 1.原理 可以看到图上的蓝色人物,边缘颜色比较深,而中间的比较浅,这是利用法线跟视线向量的点乘值计算出颜色浓度来实现的 2.代码 Sha...

600

Unity3d Shader】流光效果(模型流光)

模型的扫描效果:一道光从人物模型身上扫过。 基本原理:从顶点着色器中取到模型空间的坐标y,然后在片元着色器中用这个坐标y,做动画即可 核心代码: //模型空间坐标而非裁剪空间 o.uv.z = v.vertex.x; fixed4 col = tex2D(_MainTex, i.uv); //按在_Progress附近做一个光柱的渐变变的光柱,在C#代码中去修改_Pregress...

PangNanGua的专栏 5232

Unity3D实战【九】Shader Graph 遮挡剔除

一、在Materials文件下创建Shader Graph文件夹 然后右键creaet->shader->URP->Unlit Shader Graph(Occlusion Shader) 基于shader创建Material-Occlusion:点击刚刚创建的Shader,右键Create->Material(Occlusion) 二、双击OcclusionShader打开窗口 勾选Alpha Clip 添加新Node->Fresnel Effect:光圈效果,(替代

秃头给你一拳的博客 4017

Unity3D Shader 入门

Shader的种类Unity Shader 是将传统的硬件Shader(由 Cg / HLSL编写)嵌入到独有的描述性结构中而形成的一种代码生成框架,最终会自动生成各硬件平台自己的Shader,从而实现跨平台。Unity Shader 分为 表面着色器(Surface Shader)和 顶点片段着色器(Vertex And Fragment Shader)。 表面着色器(Surface Shader

悦峰原创博客 2万+

Unity3d Shader】运动模糊

常用的一招就是延时摄,以使运动的物体产生运动模糊。 摄技巧为:1,三角架固定相机;2,调长曝光时间;3,对象有运动物体和静止物体参照 用了延时摄,照片会产生艺术感,见下图(2015年1月 拍摄于上海陆家嘴)   游戏方面可喜的是Unity3d也可以实现类似效果,先看效果图 第一张为无运动模糊 第二张为有运动模糊:主体人物清晰,场景运动 第三张为第二张gif中的一帧 第...

PangNanGua的专栏 2812
上一篇: Unity3D-Shader-实现X光效果
下一篇: Unity3D-Shader-热扭曲效果
aefdwu9215
博客等级 码龄10年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值