开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:1906

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 2506|回复: 24

[海莉zhe] 【知识摘录】 Unity3D 实现雪花飘飞效果[Shader](三)

[复制链接]  [移动端链接]
排名
962
昨日变化
2

57

主题

191

帖子

2218

积分

Rank: 9Rank: 9Rank: 9

UID
76890
好友
50
蛮牛币
3174
威望
0
注册时间
2015-3-4
在线时间
767 小时
最后登录
2017-10-18

专栏作家

发表于 2017-1-4 01:05:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
    今天小编为大家分享一下,如何写一个雪花效果的Shader,因为操作过程比较简单,我直接上代码啦!
   
     1.新建一个unity3d 项目,新建一个CameraFilterPack_Atmosphere_Snow_8bits.shader文件。

      
[C#] 纯文本查看 复制代码
Shader "CameraFilterPack/Atmosphere_Snow_8bits" { 
Properties 
{
_MainTex ("Base (RGB)", 2D) = "white" {}
_TimeX ("Time", Range(0.0, 1.0)) = 1.0
_ScreenResolution ("_ScreenResolution", Vector) = (0.,0.,0.,0.)
}
SubShader
{
Pass
{
ZTest Always
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#pragma target 3.0
#pragma glsl
#include "UnityCG.cginc"
uniform sampler2D _MainTex;
uniform float _TimeX;
uniform float _Value;
uniform float _Value2;
uniform float4 _ScreenResolution;
uniform float2 _MainTex_TexelSize;
struct appdata_t
{
float4 vertex   : POSITION;
float4 color    : COLOR;
float2 texcoord : TEXCOORD0;
};
struct v2f
{
half2 texcoord  : TEXCOORD0;
float4 vertex   : SV_POSITION;
fixed4 color    : COLOR;
};
v2f vert(appdata_t IN)
{
v2f OUT;
OUT.vertex = mul(UNITY_MATRIX_MVP, IN.vertex);
OUT.texcoord = IN.texcoord;
OUT.color = IN.color;
return OUT;
}

inline float2 mod(float2 x,float2 modu) {
  return x - floor(x * (1.0 / modu)) * modu;
} 


inline float rand(float2 co)
{
        float r;
        co = floor(co*_Value2);
         r = frac(sin(dot(co.xy,float2(12.9898,78.233))) * 43758.5453);
   return r;
}

float4 frag (v2f i) : COLOR
{
        float2 uv = i.texcoord.xy;
        
    float3 col=tex2D(_MainTex,uv).rgb;
        #if UNITY_UV_STARTS_AT_TOP
if (_MainTex_TexelSize.y < 0)
uv.y = 1-uv.y;
#endif
   float ts=uv.y-.2+sin(uv.x*4.0+7.4*cos(uv.x*10.0))*0.005;
 
    uv*=2.0;
    
    float c=cos(8*0.01),si=sin(8*0.01);
        uv=(uv-0.5)*float2(c+si,-si+c);        
    
    float s=rand(mod(uv * 1.01 +float2(_TimeX,_TimeX)*float2(0.02,0.501),1.0)).r;
    col=lerp(col,float3(1.0,1.0,1.0),smoothstep(0.9,1.0, s * .9 * _Value));
    
         s=rand(mod(uv * 1.07 +float2(_TimeX,_TimeX)*float2(0.02,0.501),1.0)).r;
         col=lerp(col,float3(1.0,1.0,1.0),smoothstep(0.9,1.0, s * 1. * _Value));
    
        s=rand(mod(uv+float2(_TimeX,_TimeX)*float2(0.05,0.5),1.0)).r;
    col=lerp(col,float3(1.0,1.0,1.0),smoothstep(0.9,1.0, s * .98 * _Value));
        
        s=rand(mod(uv * .9 +float2(_TimeX,_TimeX)*float2(0.02,0.51),1.0)).r;
    col=lerp(col,float3(1.0,1.0,1.0),smoothstep(0.9,1.0, s * .99 * _Value));
        
        s=rand(mod(uv * .75 +float2(_TimeX,_TimeX)*float2(0.07,0.493),1.0)).r;
    col=lerp(col,float3(1.0,1.0,1.0),smoothstep(0.9,1.0, s * 1. * _Value));
        
        s=rand(mod(uv * .5 +float2(_TimeX,_TimeX)*float2(0.03,0.504),1.0)).r;
    col=lerp(col,float3(1.0,1.0,1.0),smoothstep(0.94,1.0, s * 1. * _Value));
        
        s=rand(mod(uv * .3 +float2(_TimeX,_TimeX)*float2(0.02,0.497),1.0)).r;
    col=lerp(col,float3(1.0,1.0,1.0),smoothstep(0.95,1.0, s * 1. * _Value));
        
        s=rand(mod(uv * .1 +float2(_TimeX,_TimeX)*float2(0.0,0.51),1.0)).r;
        col=lerp(col,float3(1.0,1.0,1.0),smoothstep(0.96,1.0, s * 1. * _Value));
        
        s=rand(mod(uv * .03 +float2(_TimeX,_TimeX)*float2(0.0,0.523),1.0)).r;
        col=lerp(col,float3(1.0,1.0,1.0),smoothstep(0.99,1.0, s * 1. * _Value));
    
        return  float4(col,1.0);
}
ENDCG
}
}
}

     
    2.为了方便更改shader的一些参数,所以我们新建一个CameraFilterPack_Atmosphere_Snow_8bits.cs 组件类。

      
[C#] 纯文本查看 复制代码
using UnityEngine;
using System.Collections;
[ExecuteInEditMode]
[AddComponentMenu ("Camera Filter Pack/Pixel/Snow_8bits")]
public class CameraFilterPack_Atmosphere_Snow_8bits : MonoBehaviour {
#region Variables
public Shader SCShader;
private float TimeX = 1.0f;
private Vector4 ScreenResolution;
private Material SCMaterial;
[Range(0.9f, 2f)]
public float Threshold = 1f;
[Range(8f, 256f)]
public float Size = 64f;
[Range(0f, 10f)]
private float Value3 = 1f;
[Range(0f, 10f)]
private float Value4 = 1f;
public static float ChangeValue;
public static float ChangeValue2;
public static float ChangeValue3;
public static float ChangeValue4;
#endregion
#region Properties
Material material
{
get
{
if(SCMaterial == null)
{
SCMaterial = new Material(SCShader);
SCMaterial.hideFlags = HideFlags.HideAndDontSave;
}
return SCMaterial;
}
}
#endregion
void Start ()
{
ChangeValue = Threshold;
ChangeValue2 = Size;
ChangeValue3 = Value3;
ChangeValue4 = Value4;
SCShader = Shader.Find("CameraFilterPack/Atmosphere_Snow_8bits");
if(!SystemInfo.supportsImageEffects)
{
enabled = false;
return;
}
}

void OnRenderImage (RenderTexture sourceTexture, RenderTexture destTexture)
{
if(SCShader != null)
{
TimeX+=Time.deltaTime;
if (TimeX>100)  TimeX=0;
material.SetFloat("_TimeX", TimeX);
material.SetFloat("_Value", Threshold);
material.SetFloat("_Value2", Size);
material.SetFloat("_Value3", Value3);
material.SetFloat("_Value4", Value4);
material.SetVector("_ScreenResolution",new Vector4(sourceTexture.width,sourceTexture.height,0.0f,0.0f));
Graphics.Blit(sourceTexture, destTexture, material);
}
else
{
Graphics.Blit(sourceTexture, destTexture);
}
}
void OnValidate()
{
                ChangeValue=Threshold;
                ChangeValue2=Size;
                ChangeValue3=Value3;
                ChangeValue4=Value4;
}
void Update ()
{
if (Application.isPlaying)
{
Threshold = ChangeValue;
Size = ChangeValue2;
Value3 = ChangeValue3;
Value4 = ChangeValue4;
}
#if UNITY_EDITOR
if (Application.isPlaying!=true)
{
SCShader = Shader.Find("CameraFilterPack/Atmosphere_Snow_8bits");
}
#endif
}
void OnDisable ()
{
if(SCMaterial)
{
DestroyImmediate(SCMaterial);
}
}
}

    3.在摄像机上附加AddCameraFilter.cs组件,为了方便控制看出效果。

     
[C#] 纯文本查看 复制代码
using UnityEngine;

public class AddCameraFilter : MonoBehaviour {

    private CameraFilterPack_Atmosphere_Snow_8bits _cameraFilterPack;
    // Use this for initialization
    void Start()
    {
        _cameraFilterPack = GetComponent<CameraFilterPack_Atmosphere_Snow_8bits>();
    }

    // Update is called once per frame
    void OnGUI()
    {

        if (GUI.Button(new Rect(50, 200, 200, 30), "添加雪花效果"))
        {
            if (_cameraFilterPack == null)
                _cameraFilterPack = gameObject.AddComponent<CameraFilterPack_Atmosphere_Snow_8bits>();
            if (_cameraFilterPack != null)
                _cameraFilterPack.enabled = true;
        }
        if (GUI.Button(new Rect(50, 250, 200, 30), "移除雪花效果"))
        {
            if (_cameraFilterPack != null)
                _cameraFilterPack.enabled = false;
        }
    }
}


    4.好吧!最后我们直接运行项目看效果噢!
   
       4_0.png

       4_1.png



回复

使用道具 举报

5熟悉之中
665/1000
排名
3367
昨日变化
1

1

主题

87

帖子

665

积分

Rank: 5Rank: 5

UID
161426
好友
0
蛮牛币
1529
威望
0
注册时间
2016-8-9
在线时间
238 小时
最后登录
2017-10-18

迈向小康

发表于 2017-1-4 02:54:12 | 显示全部楼层
很炫,楼主,该睡觉了

回复 支持 反对

使用道具 举报

3偶尔光临
234/300
排名
13171
昨日变化
17

2

主题

146

帖子

234

积分

Rank: 3Rank: 3Rank: 3

UID
198779
好友
0
蛮牛币
125
威望
0
注册时间
2017-1-4
在线时间
42 小时
最后登录
2017-7-21
发表于 2017-1-4 05:34:44 | 显示全部楼层
这个很实用啊

回复

使用道具 举报

5熟悉之中
892/1000
排名
1967
昨日变化

0

主题

85

帖子

892

积分

Rank: 5Rank: 5

UID
130931
好友
1
蛮牛币
2645
威望
0
注册时间
2015-12-5
在线时间
251 小时
最后登录
2017-10-18
发表于 2017-1-4 09:16:04 | 显示全部楼层
好东西,先马了

回复

使用道具 举报

7日久生情
1817/5000
排名
1002
昨日变化
1

3

主题

336

帖子

1817

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
66284
好友
3
蛮牛币
4797
威望
0
注册时间
2015-1-6
在线时间
585 小时
最后登录
2017-10-19
发表于 2017-1-4 09:29:36 | 显示全部楼层
嗯,表示很实用.

回复

使用道具 举报

5熟悉之中
565/1000
排名
5182
昨日变化
1

5

主题

199

帖子

565

积分

Rank: 5Rank: 5

UID
187870
好友
0
蛮牛币
902
威望
0
注册时间
2016-11-29
在线时间
155 小时
最后登录
2017-10-1
发表于 2017-1-4 09:49:27 | 显示全部楼层
代码是什么鬼

回复

使用道具 举报

5熟悉之中
725/1000
排名
2235
昨日变化
10

0

主题

36

帖子

725

积分

Rank: 5Rank: 5

UID
155395
好友
1
蛮牛币
1672
威望
0
注册时间
2016-7-6
在线时间
189 小时
最后登录
2017-10-19
发表于 2017-1-4 09:52:16 | 显示全部楼层
这个好像之前有人发过了

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1141/1500
排名
2365
昨日变化
2

3

主题

310

帖子

1141

积分

Rank: 6Rank: 6Rank: 6

UID
25330
好友
0
蛮牛币
1766
威望
0
注册时间
2014-5-16
在线时间
353 小时
最后登录
2017-2-27
发表于 2017-1-4 10:01:58 | 显示全部楼层
这个雪花很尴尬啊

回复 支持 反对

使用道具 举报

7日久生情
2931/5000
排名
1614
昨日变化
7

4

主题

1774

帖子

2931

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
182740
好友
0
蛮牛币
4460
威望
0
注册时间
2016-11-10
在线时间
513 小时
最后登录
2017-10-19

迈向小康

发表于 2017-1-4 10:55:12 | 显示全部楼层
谢谢分享!!!!!

回复

使用道具 举报

排名
32170
昨日变化
23

0

主题

14

帖子

21

积分

Rank: 1

UID
195290
好友
0
蛮牛币
0
威望
0
注册时间
2016-12-23
在线时间
1 小时
最后登录
2017-1-4
发表于 2017-1-4 14:38:29 | 显示全部楼层
谢谢分享!

回复

使用道具 举报

3偶尔光临
201/300
排名
15278
昨日变化
13

0

主题

119

帖子

201

积分

Rank: 3Rank: 3Rank: 3

UID
122640
好友
0
蛮牛币
55
威望
0
注册时间
2015-9-14
在线时间
50 小时
最后登录
2017-10-19
发表于 2017-1-4 17:50:52 | 显示全部楼层

很炫,楼主,该睡觉了

回复 支持 反对

使用道具 举报

7日久生情
3092/5000
排名
93
昨日变化

0

主题

390

帖子

3092

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
239
好友
3
蛮牛币
5577
威望
0
注册时间
2013-6-6
在线时间
640 小时
最后登录
2017-10-19
发表于 2017-1-5 09:19:30 | 显示全部楼层
不错!!!!!!!!!

回复

使用道具 举报

5熟悉之中
617/1000
排名
4783
昨日变化
3

0

主题

183

帖子

617

积分

Rank: 5Rank: 5

UID
160770
好友
6
蛮牛币
422
威望
0
注册时间
2016-8-5
在线时间
209 小时
最后登录
2017-10-14
发表于 2017-1-5 09:20:22 | 显示全部楼层
好,感谢分享

回复

使用道具 举报

排名
5219
昨日变化
3

2

主题

93

帖子

952

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
18242
好友
4
蛮牛币
3128
威望
0
注册时间
2014-3-19
在线时间
579 小时
最后登录
2017-10-16

认证开发者

发表于 2017-1-5 10:07:16 | 显示全部楼层
感觉非常好。

回复

使用道具 举报

5熟悉之中
925/1000
排名
3948
昨日变化
24

0

主题

467

帖子

925

积分

Rank: 5Rank: 5

UID
156480
好友
0
蛮牛币
1498
威望
0
注册时间
2016-7-12
在线时间
172 小时
最后登录
2017-10-19
发表于 2017-1-5 10:12:00 | 显示全部楼层
6666666666666666

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表