这一节我们要实现下面的效果

(图一)

(图二)

首先针对图一我们创建一个材质,并把颜色改成红色的,然后我们就得到了一个很普通的红色小球。

我们只需要在鼠标进入的时候把材质的Shader换成带边缘光的Shader就行了。

我们新建一个c#文件取名为ShowSelected.cs.然后把这个脚本文件赋值给小球。

我们来看一下ShowSelected.cs中的代码,几乎每一句都有注释:

using UnityEngine;
using System.Collections;public class ShowSelected : MonoBehaviour {public Shader selectedShader;public Color outterColor;private Color myColor ;private Shader myShader;private bool Selected = false;// Use this for initializationvoid Start () {//保存原来的颜色值和shader,以便鼠标移出时恢复myColor = GetComponent<Renderer>().material.color;myShader = GetComponent<Renderer>().material.shader;//鼠标移入时要使用的shaderselectedShader = Shader.Find("Custom/Rim Lighting2");if(!selectedShader){enabled = false;return;}}//鼠标进入void OnMouseEnter() {//替换ShaderGetComponent<Renderer>().material.shader = selectedShader;//设置边缘光颜色值GetComponent<Renderer>().material.SetColor("_RimColor",outterColor);//设置纹理颜色值GetComponent<Renderer>().material.SetColor("_MainColor",myColor);}//鼠标移出void OnMouseExit(){//恢复颜色值GetComponent<Renderer>().material.color = myColor;//恢复shaderGetComponent<Renderer>().material.shader = myShader;}
}

我们来看一下带边缘光的Shader的代码:

Shader "Custom/Rim Lighting2" {//属性域Properties {//纹理颜色_MainColor ("Main Color", Color) = (1,1,1,1)//主纹理属性_MainTex ("Texture", 2D) = "white" {}//法线贴图纹理属性_BumpMap ("Bumpmap", 2D) = "bump" {}//边缘光颜色值_RimColor ("Rim Color", Color) = (1,1,1,1)//边缘光强度值_RimPower ("Rim Power", Range(0.5,8.0)) = 3.0}SubShader {//标明渲染类型是不透明的物体Tags { "RenderType" = "Opaque" }//标明CG程序的开始CGPROGRAM//声明表面着色器函数#pragma surface surf Lambert//定义着色器函数输入的参数Inputstruct Input {//主纹理坐标值float2 uv_MainTex;//法线贴图坐标值float2 uv_BumpMap;//视图方向float3 viewDir;};//声明对属性的引用float4 _MainColor;sampler2D _MainTex;sampler2D _BumpMap;float4 _RimColor;float _RimPower;//表面着色器函数void surf (Input IN, inout SurfaceOutput o) {fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);//赋值颜色信息o.Albedo = tex.rgb * _MainColor.rgb;//赋值法线信息o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal));//赋值自发光颜色信息o.Emission = _RimColor.rgb * pow (rim, _RimPower);}//标明CG程序的结束ENDCG} Fallback "Diffuse"
}

这样就可以实现图一中的效果了

我们来看看图二的效果是怎么实现的

同样我们新建一个C#文件,取名为ShowSelectedBump.cs,我们来看一下这个CS文件中的代码,同样每一句都有注释

using UnityEngine;
using System.Collections;public class ShowSelectedBump : MonoBehaviour {public Shader selectedShader;public Color outterColor;private Color myColor ;private Shader myShader;private SkinnedMeshRenderer sRenderer;private bool Selected = false;// Use this for initializationvoid Start () {sRenderer = GetComponentInChildren<SkinnedMeshRenderer>();//保存原来的颜色值和shader,以便鼠标移出时恢复myColor = sRenderer.material.color;myShader = sRenderer.material.shader;//鼠标移入时要使用的shaderselectedShader = Shader.Find("Custom/RimLightSpecBump");if(!selectedShader){enabled = false;return;}}//鼠标进入void OnMouseEnter() {//替换ShadersRenderer.material.shader = selectedShader;//设置边缘光颜色值sRenderer.material.SetColor("_RimColor",outterColor);//设置纹理颜色值sRenderer.material.SetColor("_MainColor",myColor);}//鼠标移出void OnMouseExit(){//恢复颜色值sRenderer.material.color = myColor;//恢复shadersRenderer.material.shader = myShader;}}

我们看到处理动画模型的ShowSelectedBump.cs和ShowSelected.cs唯一不同的是这一句代码

sRenderer = GetComponentInChildren<SkinnedMeshRenderer>();

只是获取模型的渲染组件不同而已,我们的shader文件用的是同一个。

这样就可以很方便的实现图二的效果了。

Unity Shader 表面着色器边缘光(Rim Lighting)二相关推荐

  1. Unity Shader着色器优化

    对游戏开发者而言,着色器长久以来就是游戏开发中的重要部分,在Unity中编写并实现着色器的过程直观且高效,优秀的着色器还可以创造非常精美的游戏画面,同时保证极高的性能.今天将由Unity的技术工程师张 ...

  2. Unity Shader学习:体积光/体积阴影

    Unity Shader学习:体积光/体积阴影 在前向渲染下实现平行光的体积光影效果,需要全屏深度图,延迟渲染会更划算. 思路:通过ray marching的步进点位置计算该点是否在阴影中,采样阴影贴 ...

  3. Unity 车轮碰撞器的入门使用(二)

    Unity 车轮碰撞器的入门使用(二) 这节来分析一下车轮碰撞器里面的参数:如图 Mass:车轮的质量大小 Radius:车轮的半径大小 Wheel Damping Rate:车轮的阻尼值大小,必须要 ...

  4. Unity3D Shader系列之边缘光RimLight

    目录 1 引言 2 原理 3 源码 3.1 顶点-片元着色器版本 3.2 Surf着色器版本 4 参考文章 1 引言 这一两个月会花一点时间来集中总结下用Shder实现的效果.其实我一直在想为什么自己 ...

  5. 【Unity Shader】聚光灯体积光效果的简单实现

    效果如下: Unity中的聚光灯SpotLight,可以用作手电筒,射灯等类似的效果,比如这样的 但是如果想把光束的效果做出来,就超出了SpotLight的能力范围了,本篇就为了记录一下一种简单的实现 ...

  6. UnityShader学习笔记 Unity的表面着色器

    将渲染流程划分为表面着色器.光照模型和光照着色器这样的层面. 其中,表面着色器定义了模型表面的反射率.法线和高光等,光照模型选择是使用兰伯特还是Blinn-Phong等模型.而光照着色器负责计算光照衰 ...

  7. 第十六章 Unity的表面着色器探秘(2)

    文章目录 1.两个结构体 数据来源:Input结构体 2.Unity背后使用了什么 1.两个结构体 上一节我们已经讲过,表面着色器支持最多自定义4种关键函数:表面函数(用于设置各种表面性质,如反射率. ...

  8. 麒麟子Cocos Creator 3D研究笔记九:初尝Shader并实现边缘光(RimLight)

    零.先看一些图 图1:边缘光因子检查 图2:黄色,一般用于霸体效果 图3:红色,一般用于特殊技能特效 图4:白色,一般用于受击效果 图5:绿色,一般用于人物,NPC选中时高亮 看着群里的小伙伴们都很热 ...

  9. Unity之ASE实现边缘光效果

    一.前言 今天来实现一个简单的边缘光效果,可以应用与物体表面的一种荧光外溢的效果,特别是用在人的身体表面,会让人的皮肤更细腻,更好看. 物体上效果如下: 人体表面效果如下: 我们可以看到,这种人体表面 ...

最新文章

  1. union 中的注意事项
  2. Android 8.0 中如何读取内部和外部存储以及外置SDcard
  3. git http仓库账号密码缓存至本地:不用每次git push都需要输入密码的方法(类似于windows的凭据管理)
  4. SequoiaDB 系列之六 :源码分析之coord节点
  5. 获取上周_上周惠州13盘预售9盘价格涨了!最高涨1000元/㎡
  6. 人少钱少需求多的新项目该怎么带?看到这篇我心里有底了!
  7. windows下注册和取消pg服务的命令
  8. 三七互娱上半年近九成营收来自手游 精品化优势凸显
  9. android9 前台服务通知_Android通知概览
  10. micropython和python区别-MicroPython与Python速度对比
  11. 网络通讯技术在嵌入式系统中的应用
  12. Android 图片处理方法大全
  13. CSDN博客下载器v2.4发布
  14. excel宏破解方法
  15. OSI网络七层协议详解
  16. iOS 通过商品短链接跳转京东商品详情页
  17. jQuery中siblings无效
  18. 支付平台--清算总的详解
  19. C语言错误信息中文解释
  20. DLNA介绍(包括UPnP)

热门文章

  1. JSP大学实用教程(第2版)代码一
  2. 高新技术企业申请流程如何
  3. swift 点击图片预览,有放大缩小动画
  4. 易语言零基础新手入门系列教程 第一课
  5. 【vue】vue安装卡住/报错
  6. C# 使用ToolTip控件实现气泡消息提示
  7. 恢复出厂设置 LED灯闪烁
  8. Android 应用快捷方式 Shortcuts(二)
  9. JS/Jquery 中移除子元素的问题
  10. 微信小程序如何使用解析 nbsp; lt; gt; amp; apos; ensp; emsp;等字符?