下面和大家分享一个shader案例,如何实现角色动态地面印记。效果如下图所示:角色在地形上行走,地形上始终会有一个动态圆环跟随角色,类似于阴影的一个效果。但是这个

“阴影”是我们可以自己控制它的效果的,如图2所示是通过修改后得到的效果图:圆环是有一定频率别的收缩,这种效果在游戏中我们经常能看到。

角色动态地面印记实现方法

1、简单圆环版本

实现一的效果的Shader为

Shader "Custom/RadiusShader" {

Properties {

_Color("Color", Color) = (1,1,1,1)

_MainTex("Albedo (RGB)", 2D) = "white" {}

_Center("Center", Vector) = (0,0,0,0)

_Radius("Radius", Float) = 0.5

_RadiusColor("Radius Color", Color) = (1,0,0,1)

_RadiusWidth("Radius Width", Float) = 2

SubShader {

Tags { "RenderType"="Opaque" }

LOD 200

CGPROGRAM

// Physically based Standard lighting model, and enable shadows on all light types

#pragma surface surf Standard fullforwardshadows

// Use shader model 3.0 target, to get nicer looking lighting

#pragma target 3.0

sampler2D _MainTex;

fixed4 _Color;

float3 _Center;

float _Radius;

fixed4 _RadiusColor;

float _RadiusWidth;

struct Input {

float2 uv_MainTex;

float3 worldPos;

};

void surf(Input IN, inout SurfaceOutputStandard o) {

float d = distance(_Center, IN.worldPos);

if (d > _Radius && d < _Radius + _RadiusWidth)

o.Albedo = _RadiusColor;

else

o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;

ENDCG

FallBack "Diffuse"

主要的思路其实就是在颜色输出的时候判断当前觉得位置一定半径距离范围,然后将这个范围内或者边上的颜色处理成我们预设的,代码中_Center 就是角色的世界坐标系的位置,这个位置通过C#代码在Update里给这个Shader传值,并且将半径和宽度值也

float d = distance(_Center, IN.worldPos);

if (d > _Radius && d < _Radius + _RadiusWidth)

o.Albedo = _RadiusColor;

else

o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;

一起传给Shader,代码如:

using UnityEngine;

[ExecuteInEditMode]

public class Radius : MonoBehaviour {

public Material radiusMaterial;

public float radius = 1;

public Color color = Color.white;

// Use this for initialization

void Start () {

//每帧更新shader中的参数值

// Update is called once per frame

void Update () {

radiusMaterial.SetVector("_Center", transform.position);

radiusMaterial.SetFloat("_Radius", radius);

radiusMaterial.SetColor("_RadiusColor", color);

这种效果比较简单,有了这个基础我们再拓展就比较方便了,我自己实验了介绍里的第二种效果。

2、周期频率变化版本

其实核心的部分是类似的,在这无非就是对圆环的半径宽度做了一个随着时间的正弦函数的变化,并且将预设的颜色从圆心出做了

float4 frag(vertexOutput input) : COLOR

float d = distance(_Center,input.worldPos.xyz);

float tempRadiusWidth = _RadiusWidth*abs(sin(_Time.y*_RadiusSpeed));

float4 texCol = tex2D(_MainTex, input.tex.xy);

float4 col = texCol;

if (d > _Radius&&d < _Radius + tempRadiusWidth)

col.rgb = texCol.rgb + _RadiusColor*pow(d / (_Radius + tempRadiusWidth), _RadiusPower);

else

col.rgb = texCol.rgb;

return col;

渐变的处理,这样得到的效果会更加融合自然,最后在加上关照计算的处理就可以在实际的应用中使用了。完整的Shader代码如:

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'

// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'

// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'

Shader "Unlit/RPGGroundRender"

Properties{

_MainTex("Albedo (RGB)", 2D) = "white" {}

_Center("Center", Vector) = (0,0,0,0)

_Radius("Radius",Float) = 0.5

_RadiusColor("Radius Color",Color) = (1,0,0,1)

_RadiusWidth("Radius Width",Float) = 2

_RadiusPower("RadiusPower",Range(0,10)) = 2

_RadiusSpeed("RadiusSpeed",Range(0,10)) = 50

SubShader

Tags { "RenderType" = "Opaque" "PreviewType"="Plane" }

LOD 200

Pass

CGPROGRAM

#pragma vertex vert

#pragma fragment frag

#pragma target 3.0

#include "UnityCG.cginc"

//光源的颜色,Unity的Lighting.cginc文件中包含这个

float4 _LightColor0;

sampler2D _MainTex;

float3 _Center;

float _Radius;

fixed4 _RadiusColor;

float _RadiusWidth;

float _RadiusPower;

float _RadiusSpeed;

struct vertexInput {

float4 vertex : POSITION;

float3 normal : NORMAL;

float4 tex:TEXCOORD0;

};

struct vertexOutput {

float4 pos:SV_POSITION;

float4 worldPos : TEXCOORD1;

float4 col : COLOR;

float4 tex:TEXCOORD0;

};

//顶点程序部分增加了计算光照的部分

vertexOutput vert(vertexInput input)

vertexOutput output;

float4x4 modelMatrix = unity_ObjectToWorld;

float4x4 modelMatrixInverse = unity_WorldToObject;

float3 normalDirection = normalize(

mul(float4(input.normal, 0.0), modelMatrixInverse).xyz);

float3 lightDirection = normalize(_WorldSpaceLightPos0.xyz);

float3 diffuseReflection = _LightColor0.rgb * max(0.0, dot(normalDirection, lightDirection));

output.col = float4(diffuseReflection, 1.0);

output.pos= UnityObjectToClipPos(input.vertex);

output.worldPos = mul(unity_ObjectToWorld, input.vertex);

output.tex = input.tex;

return output;

float4 frag(vertexOutput input) : COLOR

float d = distance(_Center,input.worldPos.xyz);

float tempRadiusWidth = _RadiusWidth*abs(sin(_Time.y*_RadiusSpeed));

float4 texCol = tex2D(_MainTex, input.tex.xy);

float4 col = texCol;

if (d > _Radius&&d < _Radius + tempRadiusWidth)

col.rgb = texCol.rgb + _RadiusColor*pow(d / (_Radius + tempRadiusWidth), _RadiusPower);

else

col.rgb = texCol.rgb;

return col;

ENDCG

给Shader实时传数据的C#控制脚本代码:

using UnityEngine;

using System.Collections;

[ExecuteInEditMode]

public class RPGRenderControl : MonoBehaviour {

public Material radiusMaterial;

public Color color = Color.white;

public float radius = 10f;

public float radiusWidth = 2f;

public float power = 5f;

public float speed = 60f;

// Use this for initialization

void Start () {

// Update is called once per frame

//保持渲染位置时刻都跟踪这个对象

void Update () {

radiusMaterial.SetVector("_Center", transform.position);

radiusMaterial.SetColor("_RadiusColor", color);

radiusMaterial.SetFloat("_Radius", radius);

radiusMaterial.SetFloat("_RadiusWidth", radiusWidth);

radiusMaterial.SetFloat("_RadiusPower", power);

radiusMaterial.SetFloat("_RadiusSpeed", speed);

unity3d 地面印花_Unity Shader案例篇—角色动态地面印记相关推荐

  1. UnityShader案例篇—角色动态地面印记

    一.介绍 本篇要介绍的效果如图所示:角色在地形上行走,地形上始终会有一个动态圆环跟随角色,类似于阴影的一个效果.但是这个 "阴影"是我们可以自己控制它的效果的,如图2所示是通过修改 ...

  2. Shader案例篇二《镜子2》

    Shader案例篇二<镜子2> 二.Unity中制作原理 1.简单说明:其实这个原理就是用一个摄像机去拍镜子上面的物体将得到的图像投影给Plane,最后主摄像机就能看到Plane上物体的镜 ...

  3. unity3d 地面印花_unity怎么实现挖掘泥土?

    靠造假. 只要几何造型(比如地型)的底层还是用网格表示的,"挖掘"的过程和结果就和真实的物理世界不同--你没法真的从网格上"挖"下一坨实心的东西. 如果这个挖掘 ...

  4. UnityShader案例篇—旋转、平移和缩放

    一.前言 在Unity中通过控制物体的Transform可以很容易的对物体进行旋转.平移和缩放,得到一些简单的动画效果.但是有个不好的地方是,一旦这个物体上有碰撞体的话,会跟环境发生碰撞.我就就想能不 ...

  5. unity shader入门精要_Unity Shader 入门(二):shader 基础

    一.参考与说明(需要写在开始东西): 1.1 Unity Shader 入门精要学习 https://github.com/candycat1992/Unity_Shaders_Book/tree/u ...

  6. [Unity3D]Unity3D游戏开发之仿仙剑奇侠传四角色控制效果

    大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 在上一篇文章中,我们从Unity3D为我们提供的相机原型实现了非编码式的小地图,如果结合GU ...

  7. 【游戏开发实战】使用Unity制作像天天酷跑一样的跑酷游戏——第三篇:跑酷地面制作

    文章目录 一.前言 二.导入地面素材 三.制作地面预设 四.使用脚本控制地面移动 五.起始和结束位置 六.复制多个地面预设 七.运行效果 一.前言 嗨,大家好,我是新发,今天是大年初三,大家牛年快乐, ...

  8. mysql实例和数据的安全_数据库安全--案例篇

    目的 由于<数据库安全浅析>一文中,主要介绍了数据库安全方面的一些基本安全策略,缺少了必要的案例分析和处理过程.为了进一步丰富数据库安全的内容,特撰文案例篇,主要介绍数据库安全上遇到的案例 ...

  9. asp.net多图片上传案例_会计小明的故事-成本核算案例篇

    因涉及成本核算案例篇,所需要的图表比较多,但是知乎不同于微信可以直接将文档图表复制过来,知乎专栏文章,所有图表必须先截图,然后以图片形式展示.但是成本核算案例图表实在是太多,一一截图,一则影响整体观感 ...

最新文章

  1. tensorflow官网视频教程
  2. 爱立信和威瑞森电信使用VR流式车来测试5G
  3. PHP类有哪几种,PHP中有哪几种常用类型?
  4. 后台服务系统之编写服务提供方实现
  5. Liveness 探测 - 每天5分钟玩转 Docker 容器技术(143)
  6. RGB转YUV420
  7. Java基础——深入理解ReentrantLock
  8. Spring 类管理机制
  9. Kotlin学习笔记 第二章 类与对象 第二节属性
  10. mm和mmm编译说明
  11. 基于python的智能风扇设计_[Micropython]TPYBoardV102 DIY智能温控小风扇
  12. python哈姆雷特词频统计_python day 17 文本词频统计
  13. C#数据库四种执行方法(ExecuteNonQuery)
  14. [Demo]用简单的html,css做一个漂亮的网页!
  15. 一个研究生学历到底值多少钱?为什么现在那么多人选择在职考研?
  16. 【程序员眼中的统计学(11)】卡方分布的应用
  17. 用Python实现一个电影订票系统!
  18. 那些散落在风中的密码
  19. 清理360浏览器、谷歌浏览器和国产统信UOS浏览器缓存操作方法
  20. linux 360网卡开热点,扔掉360:Linux下无线网卡作WiFi路由器(转薄荷开源网)

热门文章

  1. 此处不允许使用特性 transaction-manager
  2. 树莓派配置mjpg视频流
  3. 软件测试行业进入门槛那么低,而工资那么高,对其他行业的奋力拼搏的工作者是不是巨大的打击?
  4. 企业实战-Kubernetes(十一)Kubernetes监控
  5. 缺陷检测(图像处理部分)
  6. 使用potplayer观看电视直播
  7. 程序员在周末可以做的8件事
  8. 自己数据库被攻击还被勒索了全过程
  9. 双目视觉平台学习资料:354-基于IMX214+ZYNQ XC7Z100的1080P双目视觉智能平台
  10. 【计算机网络】实验四 应用层和传输层协议分析(PacketTracer)