unity 2d残影效果怎么实现人物移动残影 求大神指点

3D残影技术实现 - 泰课在线 - 国内专业的Unity在线学习平台|Unity3d培训|Unity教程|Unity教程 Unreal 虚幻 AR|移动开发|美术CG|UI平面设计|前端开发 - Powered By EduSoho1707人阅读
Unity3D(179)
NGUI有个Demo,实现了这个功能,UI界面显示一个3D模型,但是这种方法并不具备适用性。
现在我们的项目中还没用到这种超前的3D界面设计,我们常用的UI都是由大堆的UI通过层级堆叠出来的。
那按照我们现在UI的制作方法怎么实现这种UI界面显示3D模型,3D模型还可以自由徐旋转运动的功能呢。
RenderTexture就是一种很好用的方法。
1.首先我们需要一个UITexture在UI界面中占领一个位置和层级。
现在我们看到装备栏中,一块绿油油的马赛克图片已经占领了我们给要渲染的3D模型的位置。
2.创建一个RenderTexture用来接收摄像机拍摄的画面,保存在这个RenderTexture上。
3.要显示的内容图片已经创建完成了,绑定到已经做好的UITexture上。
4.现在最重要的就要进入关键步骤了,如何把3D模型渲染到这张RenderTexure上呢?
我们只需要在场景稍微偏偏的一个地方创建一个摄像机,删除它多余的组件,只留Camera组件。
将创建好的RenderTexture绑定它的属性上,这样就可以把摄像机看到的内容全部渲染到RenderTexure这张“图片”上了
5.现在我们在摄像机前面看看效果(右下角是摄像机看到的画面)
下面是保存在RenderTexure上的画面
再下面是UI界面显示的画面
一毛一样,有木有。
运行起来,模型在动,UI上的人也在动,有木有。
6.为了避免穿帮,我们添加一个Layer专门给这个摄像机使用
另外按照功能考虑,这个摄像机并不需要渲染很远距离的东西,把Clipping planes的far属性调到一个合适的值就可以。
现在3D全身模型没了,那如果3D头像也想用实时渲染的模型呢。图像框还是圆形的怎么办呢?
下面我来做个尝试。
1.先确定框体大小,做好位置和层级的占位
2.再做一张RenderTexure,人物离近一点不就行了。那么问题来了,这还是方形的,圆形头像怎么办?
3.首先我们需要一个中间一个圆形镂空的模型
4.延后类,模型瞄准位置,摆上。
是不是很完美。
5.谁说不完美?!还差一步!
创建个shader,代码在下面:
Shader &DuanShader/maskshader&
SubShader {
Tags {&Queue& = &Geometry-10& }
Lighting Off
ZTest LEqual
ColorMask 0
镂空模型选用这个shader,在看内容。同样的佩服,通用的味道,效果就是这么完美。
rendertexture 保存; 镂空;unity创建上传头像功能;3d模型
unity3d gui 渲染到摄像机;rendertexture 透明;rendertexture在安卓上不能显示;unity 3d模型在ui中显示;将多个rendertexture放到一个摄像机上;unity rendertexture 有残影;u3unity装备栏
原文地址:/thread-.html
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:458083次
积分:6456
积分:6456
排名:第3429名
原创:37篇
转载:964篇
评论:40条
(1)(22)(42)(36)(26)(5)(2)(26)(8)(16)(25)(16)(27)(17)(40)(27)(13)(29)(57)(57)(86)(86)(60)(57)(40)(30)(54)(36)(11)(16)(3)(4)(9)(12)(17)Unity Shader : Ghost v1(残影) - 推酷
Unity Shader : Ghost v1(残影)
前阵子组长给我提了个需求,要实现角色人物的残影。我百度google了一下,发现可以用两种方式实现这个效果:1.记录前几帧的人物位置,将其传入shader中,对每个位置进行一个pass渲染。2. 通过相机的targetRender,记录前几帧的人物的影像,然后通过后处理混合上去。
这里先介绍方法1,先看效果:
残影用了alpha混合的方法,将它们变得透明。
先列出shader代码:
Shader &Custom/Ghost& {
Properties {
_MainTex (&Main Tex&, 2D) = &white& {}
_Offset0 (&Offset 0&, vector) = (0, 0, 0, 0) // 这里只显示4个残影,所以传入4个偏移值
_Offset1 (&Offset 1&, vector) = (0, 0, 0, 0)
_Offset2 (&Offset 2&, vector) = (0, 0, 0, 0)
_Offset3 (&Offset 3&, vector) = (0, 0, 0, 0)
#include &UnityCG.cginc&
sampler2D _MainT
float4 _Offset0;
float4 _Offset1;
float4 _Offset2;
float4 _Offset3;
struct v2f {
float4 pos : POSITION;
float2 uv : TEXCOORD0;
// 在shader中要渲染自身,以及4个残影,所以要定义5个不同的vert函数
v2f vert_normal(appdata_base v) { // 渲染自身的vert函数
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
// 渲染4个残影的vert函数
v2f vert_offset_1(appdata_base v) {
float4 pos = mul(_Object2World, v.vertex);
o.pos = mul(UNITY_MATRIX_VP, pos + _Offset0);
v2f vert_offset_2(appdata_base v) {
float4 pos = mul(_Object2World, v.vertex);
o.pos = mul(UNITY_MATRIX_VP, pos + _Offset1);
v2f vert_offset_3(appdata_base v) {
float4 pos = mul(_Object2World, v.vertex);
o.pos = mul(UNITY_MATRIX_VP, pos + _Offset2);
v2f vert_offset_4(appdata_base v) {
float4 pos = mul(_Object2World, v.vertex);
o.pos = mul(UNITY_MATRIX_VP, pos + _Offset3);
// 这里只定义了两个frag函数,分别是渲染自身,以及残影的
float4 frag_normal(v2f i) : COLOR {
return tex2D(_MainTex, i.uv);
float4 frag_color(v2f i) : COLOR { // 将残影的alpha值设为0.5
c = tex2D(_MainTex, i.uv);
c.w = 0.5;
SubShader { // 这里用4个pass来渲染残影,第5个pass渲染自身
Pass { // 从最远的开始渲染
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
#pragma vertex vert_offset_4
#pragma fragment frag_color
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
#pragma vertex vert_offset_3
#pragma fragment frag_color
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
#pragma vertex vert_offset_2
#pragma fragment frag_color
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
#pragma vertex vert_offset_1
#pragma fragment frag_color
Pass { // 渲染自身,这时要开启 ZWrite
Blend SrcAlpha OneMinusSrcAlpha
#pragma vertex vert_normal
#pragma fragment frag_normal
FallBack &Diffuse&
看上去挺简单的。这里要注意的一点是,从c#脚本获取的offset值,是在世界坐标中获取的,所以在计算偏移时,要先将坐标转到世界坐标。
float4 pos = mul(_Object2World, v.vertex);
o.pos = mul(UNITY_MATRIX_VP, pos + _Offset0);
接着显示C#脚本:
using UnityE
using System.C
using System.Collections.G
[ExecuteInEditMode]
public class Ghost : MonoBehaviour {
public Shader curS
private List&Vector3& offsets = new List&Vector3&(); // 存储前几帧的坐标
private List&Material& mats = new List&Material&(); // 存储人物的材质,用于给shader传参数
// Use this for initialization
void Start ()
offsets.Add(transform.position);
offsets.Add(transform.position);
offsets.Add(transform.position);
offsets.Add(transform.position);
var skinMeshRenderer = gameObject.GetComponentsInChildren&SkinnedMeshRenderer&();
foreach (var mr in skinMeshRenderer)
mats.Add(mr.material);
var meshRenderer = gameObject.GetComponentsInChildren&MeshRenderer&();
foreach (var mr in meshRenderer)
mats.Add(mr.material);
foreach (var mat in mats)
mat.shader = curS
// Update is called once per frame
void Update () {
foreach (var mat in mats) // 每帧将之前的位置传入shader中
mat.SetVector(&_Offset0&, offsets[3] - transform.position);
mat.SetVector(&_Offset1&, offsets[2] - transform.position);
mat.SetVector(&_Offset2&, offsets[1] - transform.position);
mat.SetVector(&_Offset3&, offsets[0] - transform.position);
offsets.Add(transform.position);
offsets.RemoveAt(0);
就这样,将C#脚本拖到GameObject身上就可以了
这个方法相对简单,问题就是,残影是和自身动作是一样的。如果要做成残影保留之前的动作,就需要记录动作参数,或者是直接保存前几帧的RenderTexture。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致后使用快捷导航没有帐号?
只需一步,快速开始
&加载中...
查看: 4018|回复: 8
怎么实现人物移动残影
求大神指点啊
TA的其他好贴
用模型耗资源
贴图残影要想动起来多渲染几帧做序列
如何让别人关注你?
我有个主意。
角色动作放到unity里给个纹理材质,或者光晕材质什么的,看啥材质好看给啥。完事跟 ...
用模型耗资源&&
.gif (845.28 KB, 下载次数: 37)
09:51 上传
& &贴图残影要想动起来多渲染几帧做序列
本楼回复(<span id="dp_count_)
如何让别人关注你?
楼主,不论什么情况你一定要hold住!hold住就是胜利!
本楼回复(<span id="dp_count_)
如何让别人关注你?
哥顶的不是帖子,是寂寞!
本楼回复(<span id="dp_count_)
如何让别人关注你?
本帖最后由 Another7 于
18:18 编辑
MAX渲染模型出人物轮廓图 然后粒子发射 后面你就懂了吧
楼主:你说了个屁啊?!&
本楼回复(<span id="dp_count_)
如何让别人关注你?
希望能跟CGJOY一起成长。同时也希望CGJOY越办越好。
本楼回复(<span id="dp_count_)
如何让别人关注你?
很简单啊,找到你想要的幻影的POSE,,在MAX里把动作的那一帧POSE保存成模型,,导成FBX,导入U3D,,然后给上透明度啊,材质什么的,跟在你的小物动作后面就不就行了
本楼回复(<span id="dp_count_)
如何让别人关注你?
本帖最后由 太阳当空照゛ 于
09:23 编辑
MAX渲染模型出人物轮廓图 然后粒子发射 后面你就懂了吧
懂了吧&&..
你就不能说详细点。
max渲染出人物轮廓序列图,拼起来放到untiy里粒子发射。这样的话特效是个片,而且怎么才能保证它能跟原本的角色动画的角度配上呢,
本楼回复(<span id="dp_count_)
如何让别人关注你?
我有个主意。{:5_177:}
角色动作放到unity里给个纹理材质,或者光晕材质什么的,看啥材质好看给啥。完事跟原本材质的动作配上,慢上那么三帧。
然后在中间加上特效,齐活儿&&..!
用模型耗资源
[attachimg]371221[/attachimg]
贴图残影要想动起来多渲染几帧做序列&
本楼回复(<span id="dp_count_)
如何让别人关注你?
Powered by使用Unity实现角色残影特效 - 游戏开发,移动开发技术干货分享 - 泰课在线 - 国内专业的Unity在线学习平台|Unity3d培训|Unity教程|Unity教程 Unreal 虚幻 AR|移动开发|美术CG|UI平面设计|前端开发 - Powered By EduSoho

我要回帖

更多关于 unity3d 残影效果 的文章

 

随机推荐