Показать сообщение отдельно
Старый 22.09.2011, 18:35   #1
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Шейдер имитации водной поверхности на 2d изображении

На днях по баловался с синусами и косинусами, вот чего получилось
Shader "Custom/2dRipples" {
    
Properties {
        
_Color ("Text Color", Color) = (1,1,1,1) 
        
_MainTex ("Base (RGB)", 2D) = "white" { }
        
_MaskTex ("Mask", 2D) = "white" { }
        
_VericalSpeed ("Verical Speed", Range(0,10)) = 1
        _HorisontalSpeed 
("Horisontal Speed", Range(0,10)) = 1

        _VericalPeriod 
("Verical Period", Range(1,20)) = 1
        _HorisontalPeriod 
("Horisontal Period", Range(1,20)) = 1

        _VericalAmplitude 
("Verical Amplitude", Range(0,1)) = 0.5
        _HorisontalAmplitude 
("Horisontal Amplitude", Range(0,1)) = 0.5
    
}

        
SubShader {
        
Tags {
            
"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
        
Lighting Off Cull Off ZWrite Off Fog { Mode Off }

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

            #include "UnityCG.cginc"

            
struct appdata_t {
                
float4 vertex : POSITION;
                
float2 texcoord : TEXCOORD0;
            };
            
struct v2f {
                
float4 vertex : POSITION;
                
float2 texcoord : TEXCOORD0;
            };

            
sampler2D _MainTex;
            
sampler2D _MaskTex;
            
uniform float4 _MainTex_ST;
            
uniform fixed4 _Color;
            
float _VericalSpeed;
            
float _HorisontalSpeed;

            
float _VericalPeriod;
            
float _HorisontalPeriod;

            
float _VericalAmplitude;
            
float _HorisontalAmplitude;

            
v2f vert (appdata_t v)
            {
                
v2f o;
                
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
                
o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
                return 
o;
            }


            
fixed4 frag (v2f i) : COLOR
            
{
                
fixed2 uv = i.texcoord;
                
fixed4 mask = tex2D (_MaskTex, i.texcoord);
                
uv.x += (mask.r / 500) * sin(_Time.y * _HorisontalSpeed + 
                           
sin(uv.y * _HorisontalPeriod)/_HorisontalAmplitude);
                
uv.y += (mask.r / 500) * cos(_Time.y * _VericalSpeed + 
                           
sin(uv.x * _VericalPeriod) * _VericalAmplitude);

                
fixed4 c = tex2D (_MainTex, uv) * _Color;
                return 
c;
            }

            
ENDCG 
        
}
    } 

    
FallBack Off
} 
Пример работы:
http://shgames.ru/f/

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

Вторая текстура - маска, яркость которой используется для указания максимального отклонения от исходного uv на текстуре.

PS: Если у кого есть ссылки на подобные примеры (CG, HLSL, GLSL ) - поделитесь пожалуйста!
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Эти 4 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
Andvrok (07.10.2011), Lestar (22.09.2011), Nerd (23.09.2011), Nex (22.09.2011)