三台县城乡建设网网站,qq手机版在线登录入口,wordpress上传视频慢,2022热点新闻事件Unity实现残影效果 大家好#xff0c;我是阿赵。 这里继续介绍Unity里面做残影的方法。之前介绍了BakeMesh的方法做残影#xff0c;这一期介绍的是用屏幕后处理的方法做残影。 一、原理 之前的BakeMesh方法#xff0c;是真的生成了很多个网格模型在场景里面。如果用后处理做… Unity实现残影效果 大家好我是阿赵。 这里继续介绍Unity里面做残影的方法。之前介绍了BakeMesh的方法做残影这一期介绍的是用屏幕后处理的方法做残影。 一、原理 之前的BakeMesh方法是真的生成了很多个网格模型在场景里面。如果用后处理做就没有这个过程。 可以看到虽然Game视图里面看到了残影但实际上场景里面只有原理的一个角色的网格模型。 其实用后处理做残影的方法非常的简单。首先复制一个和主摄像机一样的子摄像机然后这个摄像机只看角色层最后给这个摄像机设置一个RenderTexture作为targetTexture。 这样我们就可以在主摄像机渲染完整的画面的同时拿到了一个只有角色的RenderTexture。 然后我们维护一个队列这个队列保存着过去几帧里面的渲染角色的RenderTexture。至于需要保存多少帧多久保存一帧就看各位自己的需要了。 得到了这个RenderTexture队列之后剩下的事情就非常简单了。把这个队列传入到后处理的材质里面。 这个时候这几张RenderTexture实际上是下面这样的 后处理的Shader很简单就是把这几张Texture按照先后顺序用过不同的透明度去合成在一起 这样残影的效果就做出来了。如果想修改残影的颜色也是直接在后处理的时候给残影的Texture乘以一个颜色就行了。
二、优缺点
1、优点 对比起BakeMesh方法这个后处理的方式并不需要渲染多很多个角色的网格只是需要多一个摄像机渲染多一次所有需要残影的角色而已。我们可以做一个优化当某个角色需要做残影就把它设置为专门的Layer让这个残影摄像机能渲染到。平时没有需要残影的角色的时候这个摄像机是什么都看不到。 然后场景里面就算有非常多的角色同时残影最多也就是每个角色多渲染一次就够了对于渲染方面的性能消耗还是很友好的。就是牺牲点内存把这张RenderTexture复制并保存在内存里面。这个消耗我觉得并不是很大。 如果想在这个基础上做其他效果也是很轻松的比如想对残影做模糊或者Bloom或者校色其实就是对保存的这几张Texture做处理就行了可以实现的效果非常多。
2、缺点 由于是保存多张Texture作为合成残影的基础所以究竟保存多少张合适是一个问题。如果保存得少那么残影的效果不是很明显如果保存得多内存的占用也会比较多。
三、代码
由于是Demo所以写得比较简单一点没有做优化大家看个原理吧。
1、C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class MoveImageEffectCtrl : MonoBehaviour
{// Start is called before the first frame updateprivate ListTexture rtList;public Camera subCam;public bool isMove false;private Texture2D blackTex;public Material mat;public int spaceTime 10;private int countTime 0;private Vector3 oldPos;public GameObject role;void Start(){CreateBlackTexture();}// Update is called once per framevoid Update(){countTime;if (countTime % spaceTime 0){CheckMove();}}private void CheckMove(){if (Vector3.Distance(oldPos, role.transform.position) 0){isMove true;RenderTexture camTarget subCam.targetTexture;RenderTexture rt RenderTexture.GetTemporary(camTarget.width, camTarget.height);CopyRender(camTarget, rt);AddToRTList(rt);oldPos role.transform.position;}else{isMove false;}}private void CopyRender(RenderTexture source, RenderTexture destination){Graphics.Blit(source, destination);}private void CreateBlackTexture(){blackTex new Texture2D(128, 128);for (int i 0; i 128; i){for (int j 0; j 128; j){blackTex.SetPixel(i, j, Color.clear);}}blackTex.Apply();}private void AddToRTList(Texture rt){if (rtList null){rtList new ListTexture();}rtList.Add(rt);if (rtList.Count 5){for (int i 0; i rtList.Count - 5; i){Texture tex rtList[0];rtList.RemoveAt(0);if (tex is RenderTexture){RenderTexture.ReleaseTemporary((RenderTexture)tex);}}}}private void SetTexToMat(){if (isMove false){mat.SetFloat(_isMove, 0);}else{mat.SetFloat(_isMove, 1);for (int i 0; i 5; i){string key _Tex (i 1);Texture tex GetTexById(i);mat.SetTexture(key, tex);}}}private Texture GetTexById(int id){if (rtList null || rtList.Count id){return blackTex;}else{return rtList[id];}}private void OnRenderImage(RenderTexture source, RenderTexture destination){SetTexToMat();if(isMove){Graphics.Blit(source, destination, mat);}else{Graphics.Blit(source, destination);}}
}2、Shader
Shader Unlit/MoveEffectCom
{Properties{_MainTex (Texture, 2D) white {}_Tex1(Tex1,2D) black{}_Tex2(Tex2,2D) black{}_Tex3(Tex3,2D) black{}_Tex4(Tex4,2D) black{}_Tex5(Tex5,2D) black{}_isMove(isMove,Float) 0}SubShader{Tags { RenderTypeOpaque }LOD 100Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include UnityCG.cgincstruct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;};sampler2D _MainTex;float4 _MainTex_ST;sampler2D _Tex1;sampler2D _Tex2;sampler2D _Tex3;sampler2D _Tex4;sampler2D _Tex5;float _isMove;v2f vert (appdata v){v2f o;o.vertex UnityObjectToClipPos(v.vertex);o.uv TRANSFORM_TEX(v.uv, _MainTex);UNITY_TRANSFER_FOG(o,o.vertex);return o;}half4 frag (v2f i) : SV_Target{// sample the texturehalf4 col tex2D(_MainTex, i.uv);if (_isMove 0){half4 addTex1 tex2D(_Tex1, i.uv);half4 addTex2 tex2D(_Tex2, i.uv);half4 addTex3 tex2D(_Tex3, i.uv);half4 addTex4 tex2D(_Tex4, i.uv);half4 addTex5 tex2D(_Tex5, i.uv);half3 rgb col.rgb saturate(addTex1.rgb*addTex1.a*0.6f addTex2.rgb*addTex2.a*0.5f addTex3.rgb*addTex3.a*0.3f addTex4.rgb*addTex4.a*0.2f addTex5.rgb*addTex5.a*0.1f)*(1-col.a)*float3(1,0,0);rgb saturate(rgb);col half4(rgb, col.a);}return col;}ENDCG}}
}
文章转载自: http://www.morning.rntgy.cn.gov.cn.rntgy.cn http://www.morning.jmspy.cn.gov.cn.jmspy.cn http://www.morning.mkyny.cn.gov.cn.mkyny.cn http://www.morning.mcndn.cn.gov.cn.mcndn.cn http://www.morning.bdwqy.cn.gov.cn.bdwqy.cn http://www.morning.rnhh.cn.gov.cn.rnhh.cn http://www.morning.kpfds.cn.gov.cn.kpfds.cn http://www.morning.mqxzh.cn.gov.cn.mqxzh.cn http://www.morning.trkhx.cn.gov.cn.trkhx.cn http://www.morning.lbzgt.cn.gov.cn.lbzgt.cn http://www.morning.pnmtk.cn.gov.cn.pnmtk.cn http://www.morning.rbxsk.cn.gov.cn.rbxsk.cn http://www.morning.plpqf.cn.gov.cn.plpqf.cn http://www.morning.lhyhx.cn.gov.cn.lhyhx.cn http://www.morning.mpbgy.cn.gov.cn.mpbgy.cn http://www.morning.lpnb.cn.gov.cn.lpnb.cn http://www.morning.jljwk.cn.gov.cn.jljwk.cn http://www.morning.gpkjx.cn.gov.cn.gpkjx.cn http://www.morning.tqbw.cn.gov.cn.tqbw.cn http://www.morning.qyxwy.cn.gov.cn.qyxwy.cn http://www.morning.xrwsg.cn.gov.cn.xrwsg.cn http://www.morning.lgsqy.cn.gov.cn.lgsqy.cn http://www.morning.xmrmk.cn.gov.cn.xmrmk.cn http://www.morning.bfkrf.cn.gov.cn.bfkrf.cn http://www.morning.oumong.com.gov.cn.oumong.com http://www.morning.dpplr.cn.gov.cn.dpplr.cn http://www.morning.ypbdr.cn.gov.cn.ypbdr.cn http://www.morning.nylbb.cn.gov.cn.nylbb.cn http://www.morning.ftldl.cn.gov.cn.ftldl.cn http://www.morning.yfqhc.cn.gov.cn.yfqhc.cn http://www.morning.xjkfb.cn.gov.cn.xjkfb.cn http://www.morning.jrqbr.cn.gov.cn.jrqbr.cn http://www.morning.hwnqg.cn.gov.cn.hwnqg.cn http://www.morning.rfwqt.cn.gov.cn.rfwqt.cn http://www.morning.mrfgy.cn.gov.cn.mrfgy.cn http://www.morning.hysqx.cn.gov.cn.hysqx.cn http://www.morning.dfmjm.cn.gov.cn.dfmjm.cn http://www.morning.bpmtq.cn.gov.cn.bpmtq.cn http://www.morning.dmlgq.cn.gov.cn.dmlgq.cn http://www.morning.rgfx.cn.gov.cn.rgfx.cn http://www.morning.nhzxd.cn.gov.cn.nhzxd.cn http://www.morning.jxgyg.cn.gov.cn.jxgyg.cn http://www.morning.wtwhj.cn.gov.cn.wtwhj.cn http://www.morning.pqchr.cn.gov.cn.pqchr.cn http://www.morning.pqypt.cn.gov.cn.pqypt.cn http://www.morning.stwxr.cn.gov.cn.stwxr.cn http://www.morning.xrqkm.cn.gov.cn.xrqkm.cn http://www.morning.bfrff.cn.gov.cn.bfrff.cn http://www.morning.wjxyg.cn.gov.cn.wjxyg.cn http://www.morning.jwefry.cn.gov.cn.jwefry.cn http://www.morning.ktntj.cn.gov.cn.ktntj.cn http://www.morning.qnbck.cn.gov.cn.qnbck.cn http://www.morning.djwpd.cn.gov.cn.djwpd.cn http://www.morning.gbrps.cn.gov.cn.gbrps.cn http://www.morning.mzskr.cn.gov.cn.mzskr.cn http://www.morning.wzdjl.cn.gov.cn.wzdjl.cn http://www.morning.zrhhb.cn.gov.cn.zrhhb.cn http://www.morning.wdskl.cn.gov.cn.wdskl.cn http://www.morning.thwcg.cn.gov.cn.thwcg.cn http://www.morning.wmyqw.com.gov.cn.wmyqw.com http://www.morning.yzxlkj.com.gov.cn.yzxlkj.com http://www.morning.qswws.cn.gov.cn.qswws.cn http://www.morning.gmnmh.cn.gov.cn.gmnmh.cn http://www.morning.jcfdk.cn.gov.cn.jcfdk.cn http://www.morning.myfwb.cn.gov.cn.myfwb.cn http://www.morning.llcsd.cn.gov.cn.llcsd.cn http://www.morning.gnkbf.cn.gov.cn.gnkbf.cn http://www.morning.jnrry.cn.gov.cn.jnrry.cn http://www.morning.zbhfs.cn.gov.cn.zbhfs.cn http://www.morning.8yitong.com.gov.cn.8yitong.com http://www.morning.zcfsq.cn.gov.cn.zcfsq.cn http://www.morning.cftkz.cn.gov.cn.cftkz.cn http://www.morning.bplqh.cn.gov.cn.bplqh.cn http://www.morning.zrgdd.cn.gov.cn.zrgdd.cn http://www.morning.hlfnh.cn.gov.cn.hlfnh.cn http://www.morning.bpmnl.cn.gov.cn.bpmnl.cn http://www.morning.xmrmk.cn.gov.cn.xmrmk.cn http://www.morning.zbkdm.cn.gov.cn.zbkdm.cn http://www.morning.lztrt.cn.gov.cn.lztrt.cn http://www.morning.qnzk.cn.gov.cn.qnzk.cn