Unity Shader 表面着色器边缘光(Rim Lighting)二
这一节我们要实现下面的效果
(图一)
(图二)
首先针对图一我们创建一个材质,并把颜色改成红色的,然后我们就得到了一个很普通的红色小球。
我们只需要在鼠标进入的时候把材质的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)二相关推荐
- Unity Shader着色器优化
对游戏开发者而言,着色器长久以来就是游戏开发中的重要部分,在Unity中编写并实现着色器的过程直观且高效,优秀的着色器还可以创造非常精美的游戏画面,同时保证极高的性能.今天将由Unity的技术工程师张 ...
- Unity Shader学习:体积光/体积阴影
Unity Shader学习:体积光/体积阴影 在前向渲染下实现平行光的体积光影效果,需要全屏深度图,延迟渲染会更划算. 思路:通过ray marching的步进点位置计算该点是否在阴影中,采样阴影贴 ...
- Unity 车轮碰撞器的入门使用(二)
Unity 车轮碰撞器的入门使用(二) 这节来分析一下车轮碰撞器里面的参数:如图 Mass:车轮的质量大小 Radius:车轮的半径大小 Wheel Damping Rate:车轮的阻尼值大小,必须要 ...
- Unity3D Shader系列之边缘光RimLight
目录 1 引言 2 原理 3 源码 3.1 顶点-片元着色器版本 3.2 Surf着色器版本 4 参考文章 1 引言 这一两个月会花一点时间来集中总结下用Shder实现的效果.其实我一直在想为什么自己 ...
- 【Unity Shader】聚光灯体积光效果的简单实现
效果如下: Unity中的聚光灯SpotLight,可以用作手电筒,射灯等类似的效果,比如这样的 但是如果想把光束的效果做出来,就超出了SpotLight的能力范围了,本篇就为了记录一下一种简单的实现 ...
- UnityShader学习笔记 Unity的表面着色器
将渲染流程划分为表面着色器.光照模型和光照着色器这样的层面. 其中,表面着色器定义了模型表面的反射率.法线和高光等,光照模型选择是使用兰伯特还是Blinn-Phong等模型.而光照着色器负责计算光照衰 ...
- 第十六章 Unity的表面着色器探秘(2)
文章目录 1.两个结构体 数据来源:Input结构体 2.Unity背后使用了什么 1.两个结构体 上一节我们已经讲过,表面着色器支持最多自定义4种关键函数:表面函数(用于设置各种表面性质,如反射率. ...
- 麒麟子Cocos Creator 3D研究笔记九:初尝Shader并实现边缘光(RimLight)
零.先看一些图 图1:边缘光因子检查 图2:黄色,一般用于霸体效果 图3:红色,一般用于特殊技能特效 图4:白色,一般用于受击效果 图5:绿色,一般用于人物,NPC选中时高亮 看着群里的小伙伴们都很热 ...
- Unity之ASE实现边缘光效果
一.前言 今天来实现一个简单的边缘光效果,可以应用与物体表面的一种荧光外溢的效果,特别是用在人的身体表面,会让人的皮肤更细腻,更好看. 物体上效果如下: 人体表面效果如下: 我们可以看到,这种人体表面 ...
最新文章
- union 中的注意事项
- Android 8.0 中如何读取内部和外部存储以及外置SDcard
- git http仓库账号密码缓存至本地:不用每次git push都需要输入密码的方法(类似于windows的凭据管理)
- SequoiaDB 系列之六 :源码分析之coord节点
- 获取上周_上周惠州13盘预售9盘价格涨了!最高涨1000元/㎡
- 人少钱少需求多的新项目该怎么带?看到这篇我心里有底了!
- windows下注册和取消pg服务的命令
- 三七互娱上半年近九成营收来自手游 精品化优势凸显
- android9 前台服务通知_Android通知概览
- micropython和python区别-MicroPython与Python速度对比
- 网络通讯技术在嵌入式系统中的应用
- Android 图片处理方法大全
- CSDN博客下载器v2.4发布
- excel宏破解方法
- OSI网络七层协议详解
- iOS 通过商品短链接跳转京东商品详情页
- jQuery中siblings无效
- 支付平台--清算总的详解
- C语言错误信息中文解释
- DLNA介绍(包括UPnP)