Страница 1 из 1

Шейдер снега

СообщениеДобавлено: 09 ноя 2010, 04:59
gnoblin
Шейдер снега.

Определяет верхнюю часть объекта в мировых координатах, смешивает нормалмап и диффузную текстуру у поверхности и снега.
И есть еще ползунок для контроля степени заснеженности.

snow.jpg


Синтаксис:
Используется glsl
Shader "BasicSnow" {
        Properties {
        _Color ("Main Color", Color) = (1,1,1,1)
        _SnowStr ("Snow Strength", Range (0.03, 1)) = 0.078125
        _MainTex ("Base (RGB) Gloss (A)", 2D) = "white" {}
        _SnowTex ("Base (RGB)", 2D) = "white" {}
        _BumpMap ("Normalmap", 2D) = "bump" {}
        _SnowBump ("Snow Normalmap", 2D) = "bump" {}
       
}
SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 400
       
CGPROGRAM
#pragma surface surf BlinnPhong vertex:vert
#pragma target 3.0
#include "UnityCG.cginc"

sampler2D _MainTex;
sampler2D _BumpMap;
sampler2D _SnowBump;
sampler2D _SnowTex;

float _SnowStr;

struct Input {
        float2 uv_MainTex;
        float2 uv_SnowBump;
        float snowFactor;
};

void vert (inout appdata_full v, out Input o) {
                        float3 normal = mul(_Object2World,float4(v.normal,0));
                        o.snowFactor = dot(normal, float3(0, 1, 0));
      }

void surf (Input IN, inout SurfaceOutput o) {
        half4 tex = tex2D(_MainTex, IN.uv_MainTex);
        o.Albedo = tex.rgb;
        o.Alpha = tex.a;
        half4 snowtex = tex2D(_SnowTex, IN.uv_SnowBump);
       
        o.Albedo = lerp(o.Albedo, snowtex, IN.snowFactor*_SnowStr);
        o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_MainTex));
       
        float3 snowNormal = UnpackNormal(tex2D(_SnowBump, IN.uv_SnowBump));
        o.Normal = lerp(o.Normal, snowNormal, IN.snowFactor*_SnowStr);
}
ENDCG
}

FallBack "Specular"
}

Re: Шейдер снега

СообщениеДобавлено: 09 ноя 2010, 19:53
Neodrop
Это пол шага к созданию эффекта дождя на объектах, как в Crysis

(3A4OT)

Re: Шейдер снега

СообщениеДобавлено: 09 ноя 2010, 20:08
Battle Angel Alita
Вся прелесть шейдера из сталкера/крисиса - то что он пост процесс, и не надо делать 100500 вариация стандартных шейдеров типа "Bumped Diffuse_wet", "Bumped Specular_wet", "Diffuse_wet", "Diffuse Detail_wet" и т.д.

Re: Шейдер снега

СообщениеДобавлено: 09 ноя 2010, 20:28
Neodrop
Это я и имею в виду. Потому и говорю "пол шага".

Re: Шейдер снега

СообщениеДобавлено: 13 ноя 2010, 02:01
gnoblin
Battle Angel Alita писал(а):Вся прелесть шейдера из сталкера/крисиса - то что он пост процесс, и не надо делать 100500 вариация стандартных шейдеров типа "Bumped Diffuse_wet", "Bumped Specular_wet", "Diffuse_wet", "Diffuse Detail_wet" и т.д.


а где можно почитать про этот "мокрый" шейдер? :)

Re: Шейдер снега

СообщениеДобавлено: 21 ноя 2010, 10:01
Battle Angel Alita
А вот так можно верхушки ёлок белым цветом подсветить :) Осталось текстуру снега по мировым координатам наложить
Snoww.jpg

Синтаксис:
Используется glsl
Shader "Hidden/Snoww"
{
        Properties
        {
                _MainTex ("Base (RGB)", 2D) = "white" {}
        }
        SubShader
        {
                Pass
                {              
                        ZTest Always Cull Off ZWrite Off
                        Fog { Mode off }
CGPROGRAM
#pragma vertex vert_img
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#include "UnityCG.cginc"

uniform sampler2D _MainTex;
uniform sampler2D _CameraDepthNormalsTexture;
                       
float4 frag(v2f_img i) : COLOR
{
        float4 tex = tex2D(_MainTex, i.uv);
        float4 depth_normal = tex2D(_CameraDepthNormalsTexture, i.uv);
       
        float depth;
        float3 normal;
        DecodeDepthNormal(depth_normal, depth, normal);
       
        float snowFactor = dot(normal, float3(0.0, 1.0, 0.0));
        snowFactor = saturate(snowFactor * 2.0);
       
        return lerp(tex, float4(1.0, 1.0, 1.0, 1.0), snowFactor);
}
ENDCG
                }
        }
FallBack Off
}
 

Re: Шейдер снега

СообщениеДобавлено: 21 ноя 2010, 16:14
gnoblin
\m/ :)