unity实现3D物体的残影效果
很久之前我写过一篇用对象池等知识实现的2D的残影效果
好像有挺多小伙伴看的添加链接描述
然后这几天我有入门了一下shader 接触了透明的效果
之后我就飘了 想实现一下3D残影的效果
但是这个仅限于unity自带的规则物体 我这用的是球(sphere)
而且我写的代码没有做优化 可能有点混乱
老规矩我还是给出demo吧
我这里的想法是 我弄几个小球 让后边的小球跟着前边的走
前边的后边 后边的就怎么走
这个我们利用unity的特性很容易可以实现
private void FixedUpdate(){transform.position = LastObject.position;}
这样就很容易的实现了小球的跟随效果
这时候我们就想到了透明的效果了
我们要用shader自己去写一个材质
Shader "Custom/Chapter"
{Properties{_MainTex("Main Texture",2D) = "white"{}_BaseColor("Base Color",Color) = (1.0,1.0,1.0,1.0)_AlphaScale("Alpha Threshold",Range(0,1)) = 1}SubShader{Tags{"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}//记住Transparent就完事了pass{ZWrite OnColorMask 0 // 控制该Pass不输出任何颜色}pass{ZWrite OffBlend SrcAlpha OneMinusSrcAlpha//关闭深度写入,同时开启混合。这里我们的混合因子选择了SrcAlpha 和OneMinueSrcAlpha//这两个计算因子最终可以得到半透明混合的效果。Tags{"LightMode"="ForwardBase"}//不变CGPROGRAM#pragma vertex Vertex#pragma fragment Pixel#include "Lighting.cginc"struct vertexInput{float4 vertex : POSITION;float3 normal : NORMAL;float4 texcoord : TEXCOORD0;};struct vertexOutput{float4 pos : SV_POSITION;float3 worldNormal : TEXCOORD0;float3 worldPos : TEXCOORD1;float2 uv : TEXCOORD2;};sampler2D _MainTex;fixed4 _BaseColor;fixed _AlphaScale;vertexOutput Vertex(vertexInput v){vertexOutput o;o.pos = UnityObjectToClipPos(v.vertex);o.worldNormal = UnityObjectToWorldNormal(v.normal);o.worldPos = mul(unity_ObjectToWorld,v.vertex);o.uv = v.texcoord;return o;}fixed4 Pixel(vertexOutput i):SV_TARGET{fixed3 worldNormal = normalize(i.worldNormal);fixed3 lightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));fixed3 albedo = tex2D(_MainTex,i.uv).xyz * _BaseColor.xyz;fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;fixed3 diffuse = _LightColor0.xyz * albedo * saturate(dot(worldNormal,lightDir));return fixed4(diffuse + ambient,_AlphaScale);}ENDCG}}
}
然后我们可以通过c#中的方法来修改透明度 从而实现残影的效果
private void Start(){lattmat = GetComponent<Renderer>().material;}private void Update(){lattmat.SetFloat("_AlphaScale", alpyh);}
之后我们就要思考 怎么能把后边的球联系起来
public followobject lastscript;//上一个物体的脚本public Transform LastObject;//上一个物体private Material lattmat;//本物体的材质public float alpyh;//设置的透明度
之后我们在unity中赋值
这里的赋值都上上一个物体
然后我给出完整的源码 给大家参考
后边子物体的脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class followobject : MonoBehaviour
{public followobject lastscript;//上一个物体的脚本public Transform LastObject;//上一个物体private Material lattmat;//本物体的材质public float alpyh;//设置的透明度private void Start(){lattmat = GetComponent<Renderer>().material;}private void Update(){lattmat.SetFloat("_AlphaScale", alpyh);}private void FixedUpdate(){transform.position = LastObject.position;if (lastscript == null){alpyh = ConShader.Instance.a;}else{alpyh = lastscript.alpyh;}}}
可键盘控制的物体
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class ConShader : MonoBehaviour
{public float a = 1;public bool isstart = false;public static ConShader Instance;private void Awake(){Instance = this;}private void Update(){transform.Translate(new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")) * Time.deltaTime * 20);if (isstart){a -= Time.deltaTime;}if (a < 0){isstart = false;a = 0;}if (Input.GetKeyDown(KeyCode.Space)){a = 1;isstart = true;}}
}
shader源码
Shader "Custom/Chapter"
{Properties{_MainTex("Main Texture",2D) = "white"{}_BaseColor("Base Color",Color) = (1.0,1.0,1.0,1.0)_AlphaScale("Alpha Threshold",Range(0,1)) = 1}SubShader{Tags{"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}//记住Transparent就完事了pass{ZWrite OnColorMask 0 // 控制该Pass不输出任何颜色}pass{ZWrite OffBlend SrcAlpha OneMinusSrcAlpha//关闭深度写入,同时开启混合。这里我们的混合因子选择了SrcAlpha 和OneMinueSrcAlpha//这两个计算因子最终可以得到半透明混合的效果。Tags{"LightMode"="ForwardBase"}//不变CGPROGRAM#pragma vertex Vertex#pragma fragment Pixel#include "Lighting.cginc"struct vertexInput{float4 vertex : POSITION;float3 normal : NORMAL;float4 texcoord : TEXCOORD0;};struct vertexOutput{float4 pos : SV_POSITION;float3 worldNormal : TEXCOORD0;float3 worldPos : TEXCOORD1;float2 uv : TEXCOORD2;};sampler2D _MainTex;fixed4 _BaseColor;fixed _AlphaScale;vertexOutput Vertex(vertexInput v){vertexOutput o;o.pos = UnityObjectToClipPos(v.vertex);o.worldNormal = UnityObjectToWorldNormal(v.normal);o.worldPos = mul(unity_ObjectToWorld,v.vertex);o.uv = v.texcoord;return o;}fixed4 Pixel(vertexOutput i):SV_TARGET{fixed3 worldNormal = normalize(i.worldNormal);fixed3 lightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));fixed3 albedo = tex2D(_MainTex,i.uv).xyz * _BaseColor.xyz;fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;fixed3 diffuse = _LightColor0.xyz * albedo * saturate(dot(worldNormal,lightDir));return fixed4(diffuse + ambient,_AlphaScale);}ENDCG}}
}
希望我所写的对大家有所帮助
如果有问题可以联系我 主页有我的联系方式
unity实现3D物体的残影效果相关推荐
- Unity学习笔记(8) Unity残影效果整理,3D、2D、通用方案
Unity做残影效果是个不难的工作. 但是一些细节会对使用方法产生限制,这里整理一下各种情况下推荐的残影效果实现方案 1.3D网格 (高性能) 2.2D人物 (非骨骼动画) (高性能) 3.其它场景 ...
- Unity中实现3D人物残影效果
一:效果演示 二:思路 --使用SkinnedMeshRenderer类中的BakeMesh方法去复制出新的Mesh --再使用Graphics.DrawMesh绘制会Mesh 三:核心代码实现 -- ...
- 【Unity】动作游戏开发实战详细分析-25-角色残影效果的实现
[Unity]动作游戏开发实战详细分析-25-角色残影效果的实现 基本思路 Unity中的蒙皮网格组件提供了一个接口BakeMesh,允许我们拿到当前动画帧的网格数据,借此可对烘焙网格使用半透明的边缘 ...
- 残影效果在URP中的实现及性能优化
快速跳转 残影效果概述 对象池创建对象 残影数量未达到最大 残影数量达到最大 对象池技术优化 残影生成逻辑 生成残影的时机 残影材质处理 残影材质赋予 残影材质更新 残影动画匹配 实例化绘制 其他优化 ...
- cocoscreator,RenderTexture实现残影效果
效果图如下: 实现方法: 1.将需要产生残影的物体单独设置为一个Group: 2.新建两个sprite,设置为和残影物体相同Group,一个用于显示当前帧的残影,一个保存上一帧的残影用于摄像机渲染,修 ...
- 游戏中制作酷炫拖尾残影效果实战
发现好多人都想要这个拖尾残影的效果,今天贴出来. 今天制作拖尾残影效果,效果如图:两个视角 我的游戏中角色有冲刺技能,冲刺中身后要有一个残影效果,这种效果就满足了,现在分享给大家如何制作. 1.观察需 ...
- Unity实现3D物体叠加到摄像头画面上
关注公众号 风色年代(itfantasycc) 200G 游戏开发资料合集送上~ 原文地址:unity如何实现3D物体叠加到摄像头画面上_海涛高软-CSDN博客 实现效果如下: 功能: 1 打开摄 ...
- unity 将3D物体显示在UI前面(保姆级 超容易)
将3D物体放置在UI界面 在网上看了一些教程,这篇文章就是在前人的基础上稍加简化. 总结下来,其实只需要: 加一个相机 加一个Render Texture 加一个Raw Image 接下来是详细步骤 ...
- 高通ar,unity实现3D物体识别,图片识别
话不多说,直接上干货 1.实现的效果: 2.使用步骤: (一)高通官网申请免费key值 (二)创建database (三)创建target 特别说明,此处target分为图片,3d实体模型,以及立方 ...
最新文章
- 二叉搜索树的第 k 大节点(递归,反中序遍历 + 提前返回)
- awk,sed,cut获取最后一列数据
- LED和LCD的区别
- 白话Elasticsearch03- 结构化搜索之基于bool组合多个filter条件来搜索数据
- JAVA CXF、XFIRE、AXIS webservice获取客户端IP
- ThreadPoolExecutor的七个参数详解
- Java 运算符、表达式、语句
- 苹果cms V10模板 仿优酷网PC模板+wap模板
- wordpress linux伪静态,nginx下wordpress伪静态设置
- CF1228C. Primes and Multiplication(数学)
- POJ1011 HDU1455 UVA307 UVALive5522 Sticks题解
- 《社交网站界面设计(原书第2版)》——3.6 指纹或Bio指纹
- FR跨SHEET条件汇总
- 所有ghost操作系统大全
- 数学实验matlab韩明版答案,数学实验(MATLAB版)[韩明,王家宝,李林 编著] 2012年版...
- sap abap开发从入门到精通_给你的ABAP对象打上标签(Tag)
- BT601和BT709到底什么关系
- python大学课本_求推荐一本大学Python教材|python基础教程用书
- python中grid的用法_python pack()和grid()方法一起使用
- 如何在Kubernetes中部署nginx