[зарубка] Шейдер для анимации травы \ волос

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

[зарубка] Шейдер для анимации травы \ волос

Сообщение gnoblin 18 мар 2010, 00:09

Зарубка на память [nuklear]

http://answers.unity3d.com/questions/22 ... tive-grass

Код: Выделить всё
v2f vert (appbase v)
{
    float wind = _WaveAmplitude1 * sin(_WaveFrequency1 * 2 * 3.14 * _Time.y + v.vertex.x) +
                 _WaveAmplitude2 * cos(_WaveFrequency2 * 2 * 3.14 * _Time.y + v.vertex.y);

    float split_v = 0.9;
    v.vertex = v.vertex + wind * v.texcoord.y * _WaveDirection * (v.texcoord.y > split_v);             

    v2f o;
    PositionFog( v.vertex, o.pos, o.fog );
    o.uv = v.texcoord;
    o.lightDir = ObjSpaceLightDir( v.vertex );
    o.normal = v.normal;

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

Re: [зарубка] Шейдер для анимации травы \ волос

Сообщение gnoblin 07 ноя 2010, 03:00

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

Re: [зарубка] Шейдер для анимации травы \ волос

Сообщение Battou 27 янв 2011, 09:45

А сам шейдер для Юнити для анимеации энтой травы никто не написал пока? ^_^
Battou
UNIт
 
Сообщения: 116
Зарегистрирован: 24 ноя 2010, 18:08

Re: [зарубка] Шейдер для анимации травы \ волос

Сообщение WhiteDevil 25 июн 2011, 13:46

Пытаюсь собрать упрощенный вариант, где равномерно синусоидально перемещаются два верхних вертекса у плашки полигона.
Плюс к этому наложить в том же пассе Unlit\Transparent, но не получается найти фрагментальный шейдер для транспаренты :(

Пока вот что есть:

Код: Выделить всё
// Upgrade NOTE: replaced 'PositionFog()' with multiply of UNITY_MATRIX_MVP by position

// Upgrade NOTE: replaced 'PositionFog()' with multiply of UNITY_MATRIX_MVP by position

Shader "Animation/Grass" {

   Properties {
      _MainTex ("Texture", 2D) = "white" { }

      _WaveAmplitude1 ("WaveAmplitude1", Float) = 1
      _WaveFrequency1 ("WaveFrequency1", Float) = 1
      _WaveDirection ("WaveDirection", Float) = 1
   }
      
      Category
      {
      Alphatest Greater 0.5

      SubShader {   
      
         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"

float _WaveAmplitude1;
float _WaveFrequency1;
float _WaveDirection;

sampler2D _MainTex;

struct v2f {
    float4     pos    : SV_POSITION;
    float2     uv    : TEXCOORD0;
   float3    lightDir;
   float3    normal;
};

float4 _MainTex_ST;

v2f vert (appdata_base v)
{   
   
    float wind = _WaveAmplitude1  * sin(_WaveFrequency1 * 2 * 3.14 *_Time.y + v.vertex.x) ;

    float split_v = 0.9;
   
    v.vertex.x = v.vertex.x + wind * v.texcoord.y  * _WaveDirection * (v.texcoord.y > split_v);       

    v2f o;
    o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
    o.uv = v.texcoord;
    o.lightDir = ObjSpaceLightDir( v.vertex );
    o.normal = v.normal;

    return o;
}

half4 frag (v2f i) : COLOR
{
    half4 texcol = tex2D (_MainTex, i.uv);
   
    return  texcol;
}

ENDCG

         }
      }
   }
   
   Fallback "VertexLit"
}




Результат:
Изображение

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

Re: [зарубка] Шейдер для анимации травы \ волос

Сообщение WhiteDevil 25 июн 2011, 14:08

Сделал одинаковое перемещение, разделив два верхних

Код: Выделить всё
    v.vertex.x = v.vertex.x + wind * v.texcoord.y  * _WaveDirection * (v.texcoord.y > split_v) * (v.texcoord.x < split_v);     
    v.vertex.x = v.vertex.x - wind * v.texcoord.y  * _WaveDirection * (v.texcoord.y > split_v) * (v.texcoord.x > split_v) ;   


Вопрос можно ли сделать это одной строкой, помоему булева логика нагружает шейдер.
Ну и вопрос по транспаренте остается :(
Аватара пользователя
WhiteDevil
UNIверсал
 
Сообщения: 455
Зарегистрирован: 19 дек 2010, 15:55

Re: [зарубка] Шейдер для анимации травы \ волос

Сообщение gnoblin 25 июн 2011, 16:09

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

Re: [зарубка] Шейдер для анимации травы \ волос

Сообщение gnoblin 25 июн 2011, 16:10

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

Re: [зарубка] Шейдер для анимации травы \ волос

Сообщение WhiteDevil 28 июн 2011, 13:35

Ну тогда резалт такой. Для будущего поколения :)
Шейдер перемещает два верхних вертекса синхронно + анлит транспарент шейдер. Я заюзал его для 2д игрушки

Код: Выделить всё
Shader "Animation/Grass" {

   Properties {
      _Color ("Main Color", Color) = (1,1,1,0.5)
      _MainTex ("Texture", 2D) = "white" { }

      _WaveAmplitude ("Wave Amplitude", Float) = 1
      _WaveFrequency ("Wave Frequency", Float) = 0.5
   }
      
      SubShader {   
      
            Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
            LOD 100

            ZWrite Off
            Blend SrcAlpha OneMinusSrcAlpha
   
         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"

float _WaveAmplitude;
float _WaveFrequency;
//float _WaveDirection;

float4 _Color;
sampler2D _MainTex;

struct v2f {
    float4     pos    : SV_POSITION;
    float2     uv    : TEXCOORD0;
   float3    lightDir;
   float3    normal;
};

float4 _MainTex_ST;
v2f vert (appdata_base v)
{   
   float wind = _WaveAmplitude  * sin(_WaveFrequency * 2 * 3.14 *_Time.y + v.vertex.x);
   
    v.vertex.x += wind * step(0.9, v.texcoord.y) * step(0.9, v.texcoord.x);     
   v.vertex.x -= wind * step(0.9, v.texcoord.y) * step(v.texcoord.x, 0.9);         

    v2f o;
   o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
   o.uv = v.texcoord;
   o.lightDir = ObjSpaceLightDir( v.vertex );
    o.normal = v.normal;
    return o;
}

half4 frag (v2f i) : COLOR
{
    half4 texcol = tex2D (_MainTex, i.uv);
    return texcol * _Color;
}

ENDCG
         }
      }
   Fallback "VertexLit"
}
Последний раз редактировалось WhiteDevil 30 июн 2011, 17:15, всего редактировалось 2 раз(а).
Аватара пользователя
WhiteDevil
UNIверсал
 
Сообщения: 455
Зарегистрирован: 19 дек 2010, 15:55

Re: [зарубка] Шейдер для анимации травы \ волос

Сообщение WhiteDevil 28 июн 2011, 17:02

Делаю другой шейдер, но по той же тематике. Вместо перемещения вертексов, он вращает объект. Применяю его вместо юнити-анимации.
И вобщем какая беда получается: если объект батчить (а "ручной" батчинг у меня получается когда я копирую объект кнопками Ctrl+D), то вращение происходит, как я думаю, относительно первого объекта на котором висит шейдер. То есть первый объект нормально вращается, а все остальные (а у меня их целое поле) крутятся вокруг него.
Если объект сосдавать каждый раз, перекидывая префаб на сцену, то вращение нормальное - у каждого свое. На батчинг никакой не получается :(

Сказал бы я себе мол, чтобы работало по-свойски у каждого, и материал должен быть свой у каждого, а значит и батчинга нет. Но не тут то было, предыдущий шейдер с перемещением вертексов работает то нормально :(
Другой вариант, что я не делаю учет оффсета в шейдере, мол нужно прибавление по Х и по У при переходе к другому дереву. Но у меня ничего не получается...

Вот код:
Код: Выделить всё
Shader "Animation/Rotation" {

   Properties {
      _MainTex ("Texture", 2D) = "white" { }
      _WaveAmplitude1 ("WaveAmplitude1", Float) = 1
      _WaveFrequency1 ("WaveFrequency1", Float) = 1
   }
      
      SubShader {   
      
            Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
            LOD 100

            ZWrite Off
            Blend SrcAlpha OneMinusSrcAlpha
   
         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"

sampler2D _MainTex;

struct v2f {
    float4     pos    : SV_POSITION;
    float2     uv    : TEXCOORD0;
   float3    lightDir;
   float3    normal;
};

float4 _MainTex_ST;
float _WaveAmplitude1;
float _WaveFrequency1;

float4x4 matRotateZ(float a)
{
   float4x4 retMat = 0.0f;
   float fCos = cos(a);
   float fSin = sin(a);

   retMat._11 = fCos;
   retMat._12 = -fSin;
   retMat._21 = fSin;
   retMat._22 = fCos;

   retMat._33 = retMat._44 = 1.0f;
   return retMat;
}

v2f vert (appdata_base v)
{   

   float diff = _WaveAmplitude1  * sin(_WaveFrequency1 * 2 * 3.14 *_Time.y) ;

    v2f o;
    o.pos = mul (UNITY_MATRIX_MVP, mul(matRotateZ(diff) , v.vertex));
    o.uv = v.texcoord;
    o.lightDir = ObjSpaceLightDir( v.vertex );
    o.normal = v.normal;

    return o;
}


half4 frag (v2f i) : COLOR
{
    half4 texcol = tex2D (_MainTex, i.uv);
   
    return  texcol;
}
ENDCG

         }
      }
   Fallback "VertexLit"
}


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

Re: [зарубка] Шейдер для анимации травы \ волос

Сообщение WhiteDevil 30 июн 2011, 16:35

Могу теперь сформулировать проблему. Во время процесса батчинга, тот общий используемый материал юзает мировые координаты, а значит точка отсчета у шейдера будет именно мировой центр. Вот и получилось у меня, что все объекты крутятся вокруг именно центра, а не первого объекта (как я предполагал).
Известно, что перед командой вращения, нужно сначала положить объект в точку отсчета, после чего повернуть, а потом положить обратно.
Вот и вопрос: как узнать локальную точку отсчета сбатченного объекта?
Аватара пользователя
WhiteDevil
UNIверсал
 
Сообщения: 455
Зарегистрирован: 19 дек 2010, 15:55

Re: [зарубка] Шейдер для анимации травы \ волос

Сообщение q3er 20 мар 2014, 16:16

Не идет под андроид (последний вариант). Нет анимации и прозрачности. В чем может быть дело?
q3er
UNIт
 
Сообщения: 56
Зарегистрирован: 28 дек 2013, 11:47


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

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

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