идея реализации шейдера воды

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

идея реализации шейдера воды

Сообщение idesperate 27 авг 2012, 18:55

Привет всем!
Наверное давно мучает многих вопрос как сделать красивый шейдер воды для free-версии юнити
Немного поюзав шейдер Water(Basic), пытался найти что то лучше в просторах интернета, но увы...
так как я в шейдерах бум-бум, решил немного доработать код, который выложил Spike
Синтаксис:
Используется glsl
Shader "Glass Shader" {
         Properties {
                 _Color ("Main Color", Color) = (1,1,1,1)
                 _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
                 _ReflectColor ("Reflection Color", Color) = (1,1,1,0.5)
                 _Cube ("Reflection Cubemap", Cube) = "_Skybox" { TexGen CubeReflect }
                 _ReflectStrength( "Reflection Strength" , Range(0,1)) = 0.5
                 _Fresnel( "Fresnel " , Range(0,5)) = 1.0
         }
       
     
       
 SubShader {
             
 Tags { "Queue"="Transparent"  "RenderType" = "Transparent" }    


 CGPROGRAM
#pragma surface surf Lambert alpha

struct Input  {

         float2 uv_MainTex;
         float3 viewDir;
                 float3 worldRefl;
};

uniform sampler2D _MainTex;
uniform float4 _Color;
uniform samplerCUBE _Cube;
uniform float4 _ReflectColor;
uniform float _ReflectStrength;
uniform float _Fresnel;

void surf (Input IN, inout SurfaceOutput o)
{
                 
         float4 texcol = tex2D(_MainTex, IN.uv_MainTex);
         texcol.rgb *=_Color.rgb;
         texcol.a = texcol.a * _Color.a;
       
         float4 reflectCol = texCUBE( _Cube , IN.worldRefl );
                 
         reflectCol *= _ReflectColor;
         reflectCol *= _ReflectStrength;
         
         float3 view = normalize( IN.viewDir );
         float fresnel = pow(1.0 - saturate ( dot ( view, o.Normal )), _Fresnel);
         
         texcol.rgb += reflectCol.rgb * fresnel ;
         
                 o.Albedo = texcol.rgb;
                 o.Alpha = texcol.a +  fresnel ;
}
 ENDCG

  }
         
         FallBack "Transparent/Diffuse"
}


Ну решил выдрать часть кода из Water(Basic) где он двигает bump и адаптировать в текстуру стекла
Однако из за отсутствия знаний в написании шейдеров вышло куча ошибок с переменными
исправлял, исправлял, в итоге исправив одну ошибку, вылезала другая и т.д. - бросил

Поэтому обращаюсь к Вам просбой немного подсобить с шейдером
ведь потом оно многим пригодится, кто работает на free
а шейдер для free я сумел найти только Asset Store по астрономической цене

Код Water(Basic):
Синтаксис:
Используется glsl
Shader "FX/Water (simple)" {
Properties {
        _horizonColor ("Horizon color", COLOR)  = ( .172 , .463 , .435 , 0)
        _WaveScale ("Wave scale", Range (0.02,0.15)) = .07
        _ColorControl ("Reflective color (RGB) Trans (A) ", 2D) = "" { }
        _ColorControlCube ("Reflective color cube (RGB) fresnel (A) ", Cube) = "" { TexGen CubeReflect }
        _BumpMap ("Waves Normalmap ", 2D) = "" { }
        WaveSpeed ("Wave speed (map1 x,y; map2 x,y)", Vector) = (19,9,-16,-7)
        _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
}

CGINCLUDE
// -----------------------------------------------------------
// This section is included in all program sections below

#include "UnityCG.cginc"

uniform float4 _horizonColor;

uniform float4 WaveSpeed;
uniform float _WaveScale;
uniform float4 _WaveOffset;

struct appdata {
        float4 vertex : POSITION;
        float3 normal : NORMAL;
};

struct v2f {
        float4 pos : SV_POSITION;
        float2 bumpuv[2] : TEXCOORD0;
        float3 viewDir : TEXCOORD2;
};

v2f vert(appdata v)
{
        v2f o;
        float4 s;

        o.pos = mul (UNITY_MATRIX_MVP, v.vertex);

        // scroll bump waves
        float4 temp;
        temp.xyzw = v.vertex.xzxz * _WaveScale / unity_Scale.w + _WaveOffset;
        o.bumpuv[0] = temp.xy * float2(.4, .45);
        o.bumpuv[1] = temp.wz;

        // object space view direction
        o.viewDir.xzy = normalize( ObjSpaceViewDir(v.vertex) );

        return o;
}

ENDCG
       
// -----------------------------------------------------------
// Fragment program

Subshader {
        Tags { "RenderType"="Transparent" }
        Pass {

CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest

sampler2D _BumpMap;
sampler2D _ColorControl;

half4 frag( v2f i ) : COLOR
{
        half3 bump1 = UnpackNormal(tex2D( _BumpMap, i.bumpuv[0] )).rgb;
        half3 bump2 = UnpackNormal(tex2D( _BumpMap, i.bumpuv[1] )).rgb;
        half3 bump = (bump1 + bump2) * 0.5;
       
        half fresnel = dot( i.viewDir, bump );
        half4 water = tex2D( _ColorControl, float2(fresnel,fresnel) );
       
        half4 col;
        col.rgb = lerp( water.rgb, _horizonColor.rgb, water.a );
        col.a = _horizonColor.a;
        return col;
}
ENDCG
        }
}

// -----------------------------------------------------------
//  Old cards

// three texture, cubemaps
Subshader {
        Tags { "RenderType"="Transparent" }
        Pass {
                Color (0.5,0.5,0.5,0.5)
                SetTexture [_MainTex] {
                        Matrix [_WaveMatrix]
                        combine texture * primary
                }
                SetTexture [_MainTex] {
                        Matrix [_WaveMatrix2]
                        combine texture * primary + previous
                }
                SetTexture [_ColorControlCube] {
                        combine texture +- previous, primary
                        Matrix [_Reflection]
                }
        }
}

// dual texture, cubemaps
Subshader {
        Tags { "Queue"="Transparent"  "RenderType" = "Transparent" }
        Pass {
                Color (0.5,0.5,0.5,0.5)
                SetTexture [_MainTex] {
                        Matrix [_WaveMatrix]
                        combine texture
                }
                SetTexture [_ColorControlCube] {
                        combine texture +- previous, primary
                        Matrix [_Reflection]
                }
        }
}

// single texture
Subshader {
        Tags { "Queue"="Transparent"  "RenderType" = "Transparent" }
        Pass {
                Color (0.5,0.5,0.5,0)
                SetTexture [_MainTex] {
                        Matrix [_WaveMatrix]
                        combine texture, primary
                }
        }
}

}
 
idesperate
UNец
 
Сообщения: 6
Зарегистрирован: 25 июл 2012, 00:05

Re: идея реализации шейдера воды

Сообщение mrcoder 27 авг 2012, 22:58

idesperate писал(а):так как я в шейдерах бум-бум,


так бум-бум или не бум-бум?
бум-бум обычно означает - соображаю. :-B
Аватара пользователя
mrcoder
Старожил
 
Сообщения: 704
Зарегистрирован: 28 июн 2012, 22:40

Re: идея реализации шейдера воды

Сообщение Woolf 28 авг 2012, 00:29

Увы, без рендера в текстуру вы ничего красивого с водой не сделаете (( А во фриверсии как раз таки рендера и нет.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: идея реализации шейдера воды

Сообщение idesperate 28 авг 2012, 07:30

ммм, не совсем наверное поняли меня
есть готовый шейдер стекла с reflection cubemap и френелем
задача: просто перенести часть кода шейдера Water(Basic) где двигается текстура bump, имитируя таким образом волны на поверхносоти воды
idesperate
UNец
 
Сообщения: 6
Зарегистрирован: 25 июл 2012, 00:05


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19