2D water shader

Шейдеры и все-все-все.

2D water shader

Сообщение WhiteDevil 19 июл 2011, 18:41

Всем привет! Подыскиваю себе шейдер воды для озера. Наша игра вполнена в двухмерном мультяшном стиле, с видом сверху, при этом само озеро уже нарисовано, его нужно как-то анимировать красиво.
И колеблюсь между двумя варианатми: делать какието фокусы со смещением текстур, но пока ничего толкового не получилось. Либо применить шейдер с преобразованием Фреснеля, но обычно они (включая и встроенная в юнити вода) комплексные - с рефлекшном, бампами итд, вобщем не то что нужно. По идее, нужно просто имея одну текстуру применить к ней преобразования..

Спасибо ин адванс :)
Аватара пользователя
WhiteDevil
UNIверсал
 
Сообщения: 455
Зарегистрирован: 19 дек 2010, 15:55

Re: 2D water shader

Сообщение DbIMok 19 июл 2011, 19:14

было бы неплохо какой-нибудь скриншот, чтобы понять сеттинг. в 2D играх ориентируются на слабую графику, поэтому шейдеры простые. обычно пара текструр: "маска" с прозрачными участками + скролящаяся вторая непрозрачная.
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: 2D water shader

Сообщение WhiteDevil 20 июл 2011, 13:38

Спасибо за участие :)
Вот такого рода озеро:

Изображение

Во флешовой версии используются спрайтшиты для анимированных берегов + анимированные блики в некоторых участках. Та версия что делает наша группа готовится для ПК, поэтому требуют чего-то красивого :) Вот и думаю сделать для основной части озера меш, и шейдерить ему материал.
Аватара пользователя
WhiteDevil
UNIверсал
 
Сообщения: 455
Зарегистрирован: 19 дек 2010, 15:55

Re: 2D water shader

Сообщение gnoblin 20 июл 2011, 15:05

можно волнообразно колбасить текстуру шейдером (аля heat distort)
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: 2D water shader

Сообщение WhiteDevil 20 июл 2011, 19:08

Спасиб за наводку :) Забрал соответственный шейдер у детонатора. Забрал бамп воды у стандартной юнити воды.
Вот мучаюсь наладить шейдер. У него есть поле GrabTexture, которое собирается на основе цветов, находящиеся за объектом (ну в детонаторе хитвэйв ведь прозрачный).
И вобщем как не кручу, не получается вместо ГрабТекстуры использовать текстуру самого озера. Эффект впринципе уже получился красивый (добавил постоянного движения в шейдере), но из-за граб-текстуры, озеро у меня стало зеленым (смешалось с зеленым фоном).

Вот шейдор
Код: Выделить всё
Shader "HeatDistort1" {

   Properties {
      _BumpAmt  ("Distortion", range (0,128)) = 10
      _MainTex ("Tint Color (RGB)", 2D) = "white" {}
      _BumpMap ("Normalmap", 2D) = "bump" {}
      
      _WaveAmplitude ("Wave Amplitude", Float) = 1
      _WaveFrequency ("Wave Frequency", Float) = 0.5
   }

   SubShader {
   
      Blend SrcAlpha OneMinusSrcAlpha
      Tags { "Queue"="Transparent" "RenderType"="Transparent" }
      
         Pass {
     
      CGPROGRAM
// Upgrade NOTE: excluded shader from Xbox360; has structs without semantics (struct v2f members lightDir,normal)
#pragma exclude_renderers xbox360
#pragma vertex vert
#pragma fragment frag

#include "UnityCG.cginc"

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

struct v2f {
   float4 vertex : POSITION;
   float4 uvgrab : TEXCOORD0;
   float2 uvbump : TEXCOORD1;
   float2 uvmain : TEXCOORD2;
   float t;
};


sampler2D _GrabTexture : register(s0);
float4 _GrabTexture_TexelSize;
sampler2D _BumpMap : register(s1);
sampler2D _MainTex : register(s2);

float _WaveAmplitude;
float _WaveFrequency;

uniform float _BumpAmt;


v2f vert (appdata_t v)
{
   v2f o;
   o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
   o.t = _Time;
   #if UNITY_UV_STARTS_AT_TOP
   float scale = -1.0;
   #else
   float scale = 1.0;
   #endif
   o.uvgrab.xy = (float2(o.vertex.x, o.vertex.y*scale) + o.vertex.w) * 0.5;
   o.uvgrab.zw = o.vertex.zw;
   o.uvbump = MultiplyUV( UNITY_MATRIX_TEXTURE1, v.texcoord );
   o.uvmain = MultiplyUV( UNITY_MATRIX_TEXTURE2, v.texcoord );
   return o;
}

half4 frag( v2f i ) : COLOR
{
   // calculate perturbed coordinates
   half2 bump = UnpackNormal(tex2D( _BumpMap, i.uvbump )).rg;

   float2 offset = bump * _BumpAmt * _GrabTexture_TexelSize.xy;
   i.uvgrab.xy = offset * i.uvgrab.z + i.uvgrab.xy  + _WaveAmplitude * float2(sin(_WaveFrequency * i.t), cos(_WaveFrequency * i.t));
   
   half4 col = tex2D( _GrabTexture, i.uvgrab.xy );
   half4 tint = tex2D( _MainTex, i.uvmain );
   return col * tint;
}

ENDCG
         }
      }

   Fallback "Diffuse"
}

Аватара пользователя
WhiteDevil
UNIверсал
 
Сообщения: 455
Зарегистрирован: 19 дек 2010, 15:55

Re: 2D water shader

Сообщение WhiteDevil 20 июл 2011, 19:53

Догадался под озеро поставит копию озера, но с нормальным отображением, чтоб озеро выше "грабнуло" себя же. Получилось хорошо :)
Просто непонятно, как всетаки избавиться от граббинга и получить такой эффект

Изображение
Аватара пользователя
WhiteDevil
UNIверсал
 
Сообщения: 455
Зарегистрирован: 19 дек 2010, 15:55


Вернуться в Shader Lab

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

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