Unity&Shader案例篇—膨胀效果
2017-01-17 19:07
561 查看
原文链接 : http://www.manew.com/thread-99195-1-1.html
效果:
![](http://img.manew.com/data/attachment/forum/201701/08/171528kiish90zvspgpbsj.gif)
Shader "CgInUnity/Glow"
{
Properties{
_Color("Object's Color", Color) = (0, 1, 0, 1)
_GlowColor("Glow's Color", Color) = (1, 0, 0, 0)
_Strength("Glow Strength", Range(5.0, 1.0)) = 2.0
_GlowRange("GlowRange",Range(0.1,1))=0.3
}
SubShader{
Pass{
Tags{ "LightMode" = "ForwardBase" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
float4 _Color;
float4 vert(float4 vertexPos : POSITION) : SV_POSITION{
return mul(UNITY_MATRIX_MVP, vertexPos);
}
float4 frag(void) : COLOR{
return _Color;
}
ENDCG
}
Pass{
Tags{"LightMode" = "ForwardBase" "Queue" = "Transparent" "RenderType" = "Transparent"}
// Cull Front
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
float4 _GlowColor;
float _Strength;;
float _GlowRange;
struct vInput {
float4 vertex : POSITION;
float4 normal : NORMAL;
};
struct v2f {
float4 position : SV_POSITION;
float4 col:COLOR;
};
v2f vert(vInput i) {
v2f o;
float4x4 modelMatrix = _Object2World;
float4x4 modelMatrixInverse = _World2Object;
float3 normalDirection = normalize(mul(i.normal, modelMatrixInverse)).xyz;
float3 viewDirection = normalize(_WorldSpaceCameraPos - mul(modelMatrix, i.vertex).xyz);
float4 pos = i.vertex + (i.normal * _GlowRange);
o.position = mul(UNITY_MATRIX_MVP, pos);
float3 normalDirectionT = normalize(normalDirection);
float3 viewDirectionT = normalize(viewDirection);
float strength = abs(dot(viewDirectionT, normalDirectionT));
float opacity = pow(strength, _Strength);
float4 col = float4(_GlowColor.xyz, opacity);
o.col = col;
return o;
}
float4 frag(v2f i) : COLOR{
return i.col;
}
ENDCG
}
}
}
控制部分的C#代码:
using UnityEngine;
using System.Collections;
public class GlowControl : MonoBehaviour {
private Material mat;
private float value;
[SerializeField]
float speed=1;
// Use this for initialization
void Start () {
mat = GetComponent<MeshRenderer>().sharedMaterial;
}
// Update is called once per frame
void Update () {
value = Mathf.PingPong(Time.time * speed, 5);
/// Debug.Log(value);
mat.SetFloat("_Strength", value);
}
}
效果:
![](http://img.manew.com/data/attachment/forum/201701/08/171528kiish90zvspgpbsj.gif)
Shader "CgInUnity/Glow"
{
Properties{
_Color("Object's Color", Color) = (0, 1, 0, 1)
_GlowColor("Glow's Color", Color) = (1, 0, 0, 0)
_Strength("Glow Strength", Range(5.0, 1.0)) = 2.0
_GlowRange("GlowRange",Range(0.1,1))=0.3
}
SubShader{
Pass{
Tags{ "LightMode" = "ForwardBase" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
float4 _Color;
float4 vert(float4 vertexPos : POSITION) : SV_POSITION{
return mul(UNITY_MATRIX_MVP, vertexPos);
}
float4 frag(void) : COLOR{
return _Color;
}
ENDCG
}
Pass{
Tags{"LightMode" = "ForwardBase" "Queue" = "Transparent" "RenderType" = "Transparent"}
// Cull Front
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
float4 _GlowColor;
float _Strength;;
float _GlowRange;
struct vInput {
float4 vertex : POSITION;
float4 normal : NORMAL;
};
struct v2f {
float4 position : SV_POSITION;
float4 col:COLOR;
};
v2f vert(vInput i) {
v2f o;
float4x4 modelMatrix = _Object2World;
float4x4 modelMatrixInverse = _World2Object;
float3 normalDirection = normalize(mul(i.normal, modelMatrixInverse)).xyz;
float3 viewDirection = normalize(_WorldSpaceCameraPos - mul(modelMatrix, i.vertex).xyz);
float4 pos = i.vertex + (i.normal * _GlowRange);
o.position = mul(UNITY_MATRIX_MVP, pos);
float3 normalDirectionT = normalize(normalDirection);
float3 viewDirectionT = normalize(viewDirection);
float strength = abs(dot(viewDirectionT, normalDirectionT));
float opacity = pow(strength, _Strength);
float4 col = float4(_GlowColor.xyz, opacity);
o.col = col;
return o;
}
float4 frag(v2f i) : COLOR{
return i.col;
}
ENDCG
}
}
}
控制部分的C#代码:
using UnityEngine;
using System.Collections;
public class GlowControl : MonoBehaviour {
private Material mat;
private float value;
[SerializeField]
float speed=1;
// Use this for initialization
void Start () {
mat = GetComponent<MeshRenderer>().sharedMaterial;
}
// Update is called once per frame
void Update () {
value = Mathf.PingPong(Time.time * speed, 5);
/// Debug.Log(value);
mat.SetFloat("_Strength", value);
}
}
相关文章推荐
- Unity&Shader案例篇—膨胀效果
- Unity&Shader案例篇—声纳光波效果
- Unity&Shader案例篇—屏幕渐暗效果
- Unity&Shader案例篇—声纳光波效果
- Unity&Shader案例篇—屏幕渐暗效果
- Unity&Shader基础篇-常用函数的使用与案例
- 【Unity&Shader】遮罩效果黑暗
- Unity&Shader案例篇—绘制雨滴
- Unity&Shader案例篇—火焰
- Unity&Shader案例篇—绘制雪花
- Unity&Shader案例篇—五子棋
- Unity&Shader案例篇-镜子2
- Unity&Shader高级案例篇—图形命令缓冲
- Unity&Shader案例篇—绘制雨滴
- 鼠标点击的涟漪效果(unity&shader)
- Unity&Shader基础篇-常用函数的使用与案例
- Unity&Shader案例篇—五子棋
- Unity&Shader案例篇-镜子1
- Unity 中用 Vertex & Fragment Shader 实现 surface shader 中的 Diffuse 和 Decal
- 【Unity Shader】手游中高光效果的几种实现方法