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) = (1.0,1.0,1.0,1.0)
        _SnowDirection ("Snow Direction", Vector) = (0,1,0)
        _SnowDepth ("Snow Depth", Range(0,0.3)) = 0.1
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf CustomDiffuse vertex:vert

        sampler2D _MainTex;
        sampler2D _Bump;
        float _Snow;
        float4 _SnowColor;
        float4 _SnowDirection;
        float _SnowDepth;

        struct Input {
            float2 uv_MainTex;

            //3
            float2 uv_Bump;
            float3 worldNormal; INTERNAL_DATA
        };

        void surf (Input IN, inout SurfaceOutput o) {
            half4 c = tex2D (_MainTex, IN.uv_MainTex);
            o.Normal = UnpackNormal(tex2D(_Bump, IN.uv_Bump));

            if (dot(WorldNormalVector(IN, o.Normal), _SnowDirection.xyz) > lerp(1,-1,_Snow)) {
                o.Albedo = _SnowColor.rgb;
            } else {
                o.Albedo = c.rgb;
            }

            o.Alpha = c.a;
        }

        inline float4 LightingCustomDiffuse (SurfaceOutput s, fixed3 lightDir, fixed atten) {
            float difLight = max(0, dot (s.Normal, lightDir));
            float hLambert = difLight * 0.5 + 0.5;
            float4 col;
            col.rgb = s.Albedo * _LightColor0.rgb * (hLambert * atten * 2);
            col.a = s.Alpha;
            return col;
        }

        void vert (inout appdata_full v) {
            float4 sn = mul(transpose(_Object2World) , _SnowDirection);
            if(dot(v.normal, sn.xyz) >= lerp(1,-1, (_Snow * 2) / 3)) {
                v.vertex.xyz += (sn.xyz + v.normal) * _SnowDepth * _Snow;
            }
        }
        ENDCG
    }
    FallBack "Diffuse"
}

通过以上shader可以实现在石头上叠加积雪的效果,_SnowDepth为积雪的厚度,这个shader也能实现其他一些类似的效果(如灰尘的堆积)。

原文地址:https://www.cnblogs.com/wang-jin-fu/p/8279638.html

时间: 2024-10-16 11:57:43

shader实现积雪效果的相关文章

UnityShader之积雪效果

积雪效果是比较简单的,只需要计算顶点法线方向和世界向上方向之间的点乘,将得到的值与预设的阀值比较,小于阀值为0,用这个值进行插值就OK了 代码: 1 Shader "MyShader/SnowShader" { 2 Properties{ 3 _MainTex("MainTex",2D)="white"{}//纹理 4 _SnowNum("Snow Num",Range(-1,1))=0//点乘阀值 5 _SnowIntens

[Shader]LOGO闪光效果

?? 这个效果在很多LOGO及广告宣传中都会用到.商业开发的做法应该是拿一张闪光的图,对其做uv移动,然后和原图两张图混合,这样运算会小很多,需要储存的变量也会小很多.本讲不用图而完全通过计算得出闪光区域,主要是借此加深uv计算实现特殊效果的实现,以及计算uv的方法.代码注释配合图解已经比较详细了,跟着做就行,随便找一张半透明的图来做地图即可. ? Shader "Custom/logo" {??? Properties {??? ??? _MainTex ("Texture

Unity Shader实现描边效果

http://gad.qq.com/article/detail/28346 描边效果是游戏里面非常常用的一种效果,一般是为了凸显游戏中的某个对象,会给对象增加一个描边效果.本篇文章和大家介绍下利用Shader实现描边效果,一起来看看吧. 最近又跑回去玩了玩<剑灵>,虽然出了三年了,感觉在现在的网游里面画面仍然算很好的了,剑灵里面走近或者选中NPC的一瞬间,NPC就会出现描边效果,不过这个描边效果是渐变的,会很快减弱最后消失(抓了好久才抓住一张图....) 还有就是最常见的LOL中的塔,我们把

通过渲染器Shader实现图像变换效果

在上一篇文章中,一起学习了通过设定画笔风格来实现图形变换,没读过的朋友可以点击下面链接: http://www.cnblogs.com/fuly550871915/p/4886455.html 是不是觉得自己学到的知识更多了呢?那么再多学一点总没坏处.在本篇文章中,将会一起学习通过给画笔设定Shader属性,实现图形变换.并带领读者一起实现两个实际例子,图片渲染器和线性渲染器.有没有发现我们的画笔特别强大呢??确实,我们曾经给它设置过颜色矩阵属性,设置过xfermode风格属性,现在又来设定Sh

cocos2dx中用shader实现折射效果

目的:给定任意法线贴图,实现折射效果 主要技术:RenderTarget,glsl 提取出一个可供使用的Sprite派生类 计算模型如下: 黑色部分为玻璃切线,红色部分为场景.绿色线为垂直于场景的视线及其延长线,红色为法线.我们求折射光,等于在给定的OB,法线向量下,求取视线经过折射后与场景的交点和视线延长线和场景交点的偏移量.求出偏移量以后,就能非常方便的利用texture2D函数采样rendertexture,得到颜色. 假设法线向量为a,则我们容易得到x, y方向的偏移为: deltaX

Unity Shader 屏幕后效果——Bloom外发光

Bloom的原理很简单,主要是提取渲染图像中的亮部区域,并对亮部区域进行模糊处理,再与原始图像混合而成. 一般对亮部进行模糊处理的部分采用高斯模糊,关于高斯模糊,详见之前的另一篇博客: https://www.cnblogs.com/koshio0219/p/11152534.html 计算方法: 总共需要用到4个Pass,它们的顺序如下: Pass 1:得到纹理的亮度值(灰度值),由此计算出亮部区域,传递给一个临时的新纹理,这里叫_Bloom Pass 2,3:单独对_Bloom进行高斯模糊(

Unity Shader 屏幕后效果——全局雾

Unity内置的雾效需要在每个shader中分别编写,造成了极大的不便.这里利用屏幕后处理产生可单独控制且自由度更高的雾效. 屏幕后雾效的本质在于,根据深度纹理重构每个像素在世界空间中的位置,利用得到的坐标计算出一个雾效系数,最终利用雾效系数与雾的颜色相乘并与原始颜色进行插值运算得出最终效果. float3 afterFog=f*fogColor+(1-f)*origColor; 上面的插值运算中f代表雾效系数,它有多种计算方法: 1.线性计算: f=(dmax-Abs(z))/dmax-dmi

Unity Shader 模型流光效果

Shader "Custom/FlowColor" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _FlowColor("Flow Color", Color) = (1,1,1,1) _FlowRange("Flow Range", Float) = 0.01 } SubShader { Pass { Tags { "Queue&

Unity shader实现水效果(折射,反射,波浪,1.菲尼尔,深度颜色)

整个实现过程,包括水面的UV流动,折射,反射,根据深度进行透明值处理等等 原文地址:https://www.cnblogs.com/ubanck/p/9606626.html