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(-, )]
public float Intension = ; //网格数据
SkinnedMeshRenderer[] meshRender; //X-ray
Shader ghostShader; void Start () {
//获取身上所有的Mesh
meshRender = this.gameObject.GetComponentsInChildren<SkinnedMeshRenderer> (); ghostShader = Shader.Find("lijia/Xray");
} private float lastTime = ; 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 = ; 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 <= ) {//到时间就销毁
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);
} }
}
最后的话
这篇就写完啦,这种实现方式的优点就是残影可以实时捕捉动作,比较动态。缺点是比较消耗性能,频繁创建网格,相当于要多渲染那么多个人物。
如果有好的的优化思路,欢迎在下面评论
Unity3D-Shader-人物残影效果的更多相关文章
- Unity3D手游开发日记(8) - 运动残影效果
2D游戏的残影很简单,美术做序列帧图片就行了,那么3D游戏的残影美术做不了,得靠程序员动态创建模型来处理. 实现原理也很简单: 1.间隔一定时间创建一个残影模型 GameObject go = Gam ...
- cocos2dx - shader实现任意动画的残影效果
本节主要讲利用cocos2dx机制实现opengl es shader脚本的绘制 这里先看下最终效果: 这里分别实现了灰度效果及残影的效果. 一.绘制基类 这 ...
- as3如何做出残影效果
在页游中,时不时能看到人物做一些快速移动动作如冲刺时,有残影效果,强化了画面表现.实际人肉眼之所以能看到残影的效果,是因为观察到的物体会在人视线中残留几十毫秒时间,当运动物体运动太快时,人肉眼所见未能 ...
- Unity3d 残影效果(狂拽炫酷叼炸天)
效果图,真的很叼啊 我根据别人的改进了一版,支持MeshFilter上的Mesh(需要确保Mesh的Read/Write是开启的否则不能正常工作) 非常感谢原作者给提供思路.http://blog.c ...
- unity制作人物残影-绘制的方法
这里是利用skinnedMeshRenderer原理做的 所以脚本需要挂在带这个组件的模型上 模型shader 必须要有个_Color参数属性,并且这个值可以调节颜色,会改变人物整体的透明度 [代码下 ...
- Unity3D Shader图像扭曲过场效果
把脚本挂在摄像机上 using UnityEngine; using System.Collections; [RequireComponent(typeof(Camera))] public cla ...
- Unity Shader : Ghost(残影) v1
前阵子组长给我提了个需求,要实现角色人物的残影.我百度google了一下,发现可以用两种方式实现这个效果:1.记录前几帧的人物位置,将其传入shader中,对每个位置进行一个pass渲染.2. 通过相 ...
- Unity运动残影技能
残影实现: 1.List<DrawMesh> list,此list中包含某一帧动画模型网格.材质 2.每过一段时间就将运动物体的模型add到list中(优化:未实现,网格合并) 3.Lat ...
- 【译】Unity3D Shader 新手教程(6/6) —— 更好的卡通Shader
本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 动机 如果你想了解以下几件事,我建议你阅读以下这篇教程: 想知道如何写一个multipass的toon shade ...
随机推荐
- 开涛spring3(6.6) - AOP 之 6.6 通知参数
前边章节已经介绍了声明通知,但如果想获取被被通知方法参数并传递给通知方法,该如何实现呢?接下来我们将介绍两种获取通知参数的方式. 使用JoinPoint获取:Spring AOP提供使用org.asp ...
- 用c++实现高精度加法
c++实习高精度加法 最近遇到一个c++实现高精度加法的问题,高精度问题往往十复杂但发现其中的规律后发现并没有那么复杂,这里我实现了一个整数的高精度加法,主要需要注意以下几点: 1:将所需输入的数据以 ...
- sql还原(.bak文件还原)
第一步: 右键“数据库”,选择“还原数据库” 第二步: 选择“设备”,然后选择“…” 第三步: 添加备份文件(这里使用MyDB.bak) 第四步: 勾选“还原”复选框,进度显示“已完成” 第五步: 最 ...
- idea live template
最近正在研究如何给idea添加注释模板. 此篇文章是记录在写(开发)注释模板的过程中遇到的坑. 1. methodParameters() 当函数的参数列表为空的时候返回的是: [] 当函数的参数列表 ...
- HttpClient+Jsoup 抓取网页信息(网易贵金属为例)
废话不多说直接讲讲今天要做的事. 利用HttpClient和Jsoup技术抓取网页信息.HttpClient是支持HTTP协议的客户端编程工具包,并且它支持HTTP协议. jsoup 是一款基于 Ja ...
- log4j 在项目中的详细配置
1.添加log4j 包 2.首先在src目录下添加log4j.properties文件 log4j.rootLogger=debug, stdout, R log4j.appender.stdout= ...
- Unity3D常用 API 之 Invoke 函数调用
1.金钱副本细节完善 1.1.宝箱自动掉落 给宝箱预制体添加刚体组件即可. 1.2.实现按键宝箱批量掉落 ①将实例化生成宝箱的代码单独封装成一个函数: ②使用 for 循环,批量生成宝箱. 按一次z键 ...
- mysql主键约束和唯一性约束
主键约束和唯一性约束都是索引,它们的区别是: 主键字段可以确保唯一性,但主键字段不能为NULL. 唯一性约束可以确保唯一性,但唯一性约束的字段可以为NULL 唯一性约束对含有NULL的记录不起作用,即 ...
- java基础:简单实现线程池
前段时间自己研究了下线程池的实现原理,通过一些源码对比,发现其实核心的东西不难,于是抽丝剥茧,决定自己实现一个简单线程池,当自已实现了出一个线程池后.发现原来那么高大上的东西也可以这么简单. 先上原理 ...
- easyUI的简单了解
首先简单的介绍一下jQuery EasyUI,它是一组基于jQuery的UI插件集合体,而jQuery EasyUI的目标就是帮助web开发者更轻松的打造出功能丰富并且美观的UI界面.开发者不需要编写 ...