UnityShader之积雪效果

  积雪效果是比较简单的,只需要计算顶点法线方向和世界向上方向之间的点乘,将得到的值与预设的阀值比较,小于阀值为0,用这个值进行插值就OK了

代码:

 1 Shader "MyShader/SnowShader" {
 2     Properties{
 3         _MainTex("MainTex",2D)="white"{}//纹理
 4         _SnowNum("Snow Num",Range(-1,1))=0//点乘阀值
 5         _SnowIntensity("Snow Intensity",Range(0,20))=1//积雪强度
 6         _SnowColor("Snow Color",Color)=(1.0,1.0,1.0,1.0)//积雪颜色
 7     }
 8
 9     SubShader{
10         Pass{
11             Tags{"LightMode"="ForwardBase"}
12             CGPROGRAM
13             #pragma vertex vert
14             #pragma fragment frag
15             #include "UnityCG.cginc"
16
17                 sampler2D _MainTex;
18                 float4 _MainTex_ST;
19                 fixed _SnowNum;
20                 fixed _SnowIntensity;
21                 fixed4 _SnowColor;
22
23                 struct a2v{
24                     float4 vertex:POSITION;
25                     float3 normal:NORMAL;
26                     float2 texcoord:TEXCOORD0;
27                 };
28
29                 struct v2f{
30                     float4 pos:SV_POSITION;
31                     float3 worldNormal:TEXCOORD0;
32                     float2 uv:TEXCOORD1;
33                 };
34
35                 v2f vert(a2v v){
36                     v2f o;
37                     o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
38                     o.worldNormal=UnityObjectToWorldNormal(v.normal);
39                     o.uv=v.texcoord*_MainTex_ST.xy+_MainTex_ST.zw;
40                     return o;
41                 }
42
43                 fixed4 frag(v2f i):SV_TARGET{
44                     fixed3 tex=tex2D(_MainTex,i.uv).rgb;
45                     fixed3 worldNormalDir=normalize(i.worldNormal);
46                     fixed3 worldUpDir=fixed3(0,1,0);
47                     //用smoothstep是为了使得积雪边缘过渡更平滑
48                     fixed colNum=smoothstep(_SnowNum,1,dot(worldNormalDir,worldUpDir))*_SnowIntensity;
49                     //fixed colNum=step(dot(worldNormalDir,worldUpDir),_SnowNum);
50                     fixed3 finalCol=lerp(tex,_SnowColor,colNum);
51                     return fixed4(finalCol,1);
52                 }
53             ENDCG
54         }
55     }
56     FallBack "Diffuse"
57 }

效果图:

调整这几个值也可以做出其它效果,比如放置已久积满灰尘的物体

时间: 2024-10-12 14:31:13

UnityShader之积雪效果的相关文章

shader实现积雪效果

Shader "Custom/Shader1" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _Bump ("Bump", 2D) = "bump" {} _Snow ("Snow Level", Range(0,1) ) = 0 _SnowColor ("Snow Color", Color) = (

UnityShader 序列帧动画效果

实现原理:主要思想是设置显示uv纹理的大小,并逐帧修改图片的uv坐标. 实现步骤 1.我们首先用_Time.y和速度属性_Speed相乘得到模拟的时间. 2.然后我们用time除以_HorizontalAmount的结果值作为当前的行索引,除法结果的余数则是列索引. 3.接下来,我们根据行索引和列索引来构建真正的采样坐标.由于序列帧图像包含了很多张关键帧图像,这意味着采样坐标需要映射到关键帧图像的坐标范围. 4.我们可以把原纹理坐标i.uv按行数和列数进行等分,得到每个子图像的纹理坐标范围. 5

【译】Unity3D Shader 新手教程(2/6) —— 积雪Shader

如果你是一个shader编程的新手,并且你想学到下面这些酷炫的技术,我觉得你可以看看这篇教程: 实现一个积雪效果的shader 创建一个具有凹凸纹理的shader 为每个像素修改其对应纹理值 在表面着色器中修改模型的顶点数据 引论 这是我们系列教程的第二部分,我们将在此部分实现些有用的技术.在学习完第一部分的所有背景知识后,我们将利用所学的知识实现一个简单的积雪效果的shader.效果如下: 准备工作 我们想做的其实很简单,简单介绍一下: 随着Snow Level(表示积雪的程度,该值越大,积雪

【译】Unity3D Shader 新手教程(3/6) —— 更加真实的积雪

如果你满足以下条件,我建议你阅读这篇教程: 你想知道如何在表面着色器中进行混色(blend colour) 你想实现一个更加真实的积雪效果 引论 我觉得有雪区域向无雪区域过渡的有些突兀,感觉更像白色的油漆涂在了岩石上,而不是积雪!为了使我们积雪shader的效果更加完美所以下一步需要做的是允许积雪和岩石纹理同时进行渲染,从而达到混色的效果. 我们只要对表面着色器的pixel处理方式进行一些修改就可以达到很好的积雪效果,而且这也将证明saturate函数是非常有用的. 准备工作 教程第二部分中的_

【译】Unity3D Shader 新手教程(1/6)

刚开始接触Unity3D Shader编程时,你会发现有关shader的文档相当散,这也造成初学者对Unity3D Shader编程望而却步.该系列教程的第一篇文章(译者注:即本文,后续还有5篇文章)详细介绍了Unity3D中的表面着色器(Surface Shader)的,为学习更复杂的Shader编程打下基础. 动机 如果你是刚刚接触Shader编程的新手,你可能不知道从何开始踏出Shader编程的第一步.本教程将带你一步步完成一个表面着色器(Surface Shader)和片段着色器(Fra

转 猫都能学会的Unity3D Shader入门指南(二)

猫都能学会的Unity3D Shader入门指南(二) 关于本系列 这是Unity3D Shader入门指南系列的第二篇,本系列面向的对象是新接触Shader开发的Unity3D使用者,因为我本身自己也是Shader初学者,因此可能会存在错误或者疏漏,如果您在Shader开发上有所心得,很欢迎并恳请您指出文中纰漏,我会尽快改正.在之前的开篇中介绍了一些Shader的基本知识,包括ShaderLab的基本结构和语法,以及简单逐句地讲解了一个基本的shader.在具有这些基础知识后,阅读简单的sha

Unity3D Shader入门指南(二)

关于本系列 这是Unity3D Shader入门指南系列的第二篇,本系列面向的对象是新接触Shader开发的Unity3D使用者,因为我本身自己也是Shader初学者,因此可能会存在错误或者疏漏,如果您在Shader开发上有所心得,很欢迎并恳请您指出文中纰漏,我会尽快改正.在之前的开篇中介绍了一些Shader的基本知识,包括ShaderLab的基本结构和语法,以及简单逐句地讲解了一个基本的shader.在具有这些基础知识后,阅读简单的shader应该不会有太大问题,在继续教程之前简单阅读一下Un

UnityShader实例11:积雪材质

积雪材质 概述 积雪材质是我自己给这个材质取的名字,既然是积雪,那顾名思义,雪是从天而降的,因此积雪都是在物体朝上的表面:不管你的模型怎么摆放 ,雪都保证是积在物体朝上(在unity里就是y轴正方向)的表面,如下图所示: 实现原理 要保证向上的面有积雪,其实就是模型表面的法线方向与世界坐标空间的Y轴正方向保持一致积雪多,否则积雪就少雪,所以将模型的法线方向normal从模型空间转化到世界空间,然后与y轴正方向float3(0,1,0)做点积,根据结果来确认法相的朝向和Y轴的夹角大小,从而确认是否

UnityShader基础效果-Surface Shader

Ox00 Surface Shader Syntax 常用的三种输出数据格式: //Standard output structure of surface shaders is this: struct SurfaceOutput { fixed3 Albedo; // diffuse color fixed3 Normal; // tangent space normal, if written fixed3 Emission; half Specular; // specular powe