Pulse

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

Pulse

Сообщение gnoblin 30 окт 2010, 02:20

Шейдер, который заставляет объект пульсировать.
Пульсирует достаточно хитро ).
Надо будет вынести побольше настроек :-w.

Скриншот бесполезен, поэтому не прикладываю.

Синтаксис:
Используется glsl
/// Портировано с http://www.iquilezles.org/apps/shadertoy/
/// Information: 'Pulse' by Danguafer/Silexars (2010)
Shader "Pulse" {
        Properties {
                _MainTex ("Base (RGB)", 2D) = "white" {}
                _TimeT ("Time", Float) = 0.5
        }
        SubShader {
                Tags { "RenderType"="Opaque" }
                LOD 200
               
                CGPROGRAM
                #pragma surface surf Lambert
                #pragma target 3.0
                #include "UnityCG.cginc"
               
                sampler2D _MainTex;
                float _TimeT;
               
                struct Input {
                        float2 uv_MainTex;
                };

                void surf (Input IN, inout SurfaceOutput o)
                {
                        half4 c = tex2D (_MainTex, IN.uv_MainTex);
                       
                        float2 resolution = float2(4, 4);

                        float2 halfres = resolution.xy/2.0;
                        half2 cPos = IN.uv_MainTex;

                        cPos.x -= 0.5*halfres.x*sin(_TimeT/2.0)+0.3*halfres.x*cos(_TimeT)+halfres.x;
                        cPos.y -= 0.4*halfres.y*sin(_TimeT/5.0)+0.3*halfres.y*cos(_TimeT)+halfres.y;
                        float cLength = length(cPos);

                        float2 uv = IN.uv_MainTex.xy/resolution.xy+(cPos/cLength)*sin(cLength/30.0-_TimeT*10.0)/25.0;
                        float3 col =c.rgb*5.0/cLength;

                        half4 color = half4(col,1.0);
                        o.Albedo = color.rgb;
                        o.Alpha = color.a;
                }
                ENDCG
        }
        FallBack "Diffuse"
}
 


Скрипт для управления временем (_Time из UnityCG.cginc у меня что-то не заработал):
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class TimeToShader : MonoBehaviour {

    public float timeScale = 1f;

        void Update ()
    {
        Time.timeScale = timeScale;
        renderer.material.SetFloat("_TimeT", Time.time);
       
        }
}
 
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Pulse

Сообщение antonio 30 окт 2010, 12:10

Вы используете в шейдерах тайм и управляете им в скрипте, но вот здесь
http://unity3d.com/support/documentatio ... alues.html
написано что в Unity уже встроен float4 _Time. Можно в интерфейс шейдера выносить только тайм спид. Так будет проще )
Аватара пользователя
antonio
UNIт
 
Сообщения: 132
Зарегистрирован: 03 ноя 2009, 15:42
Откуда: Смоленск

Re: Pulse

Сообщение gnoblin 30 окт 2010, 14:23

у меня не работает _Time :)

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

Re: Pulse

Сообщение antonio 30 окт 2010, 15:15

Вот набрасал _Time насколько я понимаю работает в вертексном шейдере.(и видимо будет только для Unity 3)
Может можно как-то красивее написать, но еще не научился _TimeSpeed надо побольше ставить у меня 60 иначе можно заснуть.
Синтаксис:
Используется glsl
/// Портировано с http://www.iquilezles.org/apps/shadertoy/
/// Information: 'Pulse' by Danguafer/Silexars (2010)
Shader "Pulse2" {
        Properties {
                _MainTex ("Base (RGB)", 2D) = "white" {}
                _TimeSpeed ("Time Speed", Float) = 60
        }
        SubShader {
                Tags { "RenderType"="Opaque" }
                LOD 200
               
                CGPROGRAM
                #pragma surface surf Lambert vertex:vert
                #pragma target 3.0
                #include "UnityCG.cginc"
               
                sampler2D _MainTex;
                                float _TimeSpeed;
               
                struct Input {
                        float2 uv_MainTex;
                                                float t;
                };
                               
                                void vert (inout appdata_full v, out Input o) {
                                        o.t=_Time*_TimeSpeed;
                                }

                void surf (Input IN, inout SurfaceOutput o)
                {
                        half4 c = tex2D (_MainTex, IN.uv_MainTex);
                       
                        float2 resolution = float2(4, 4);

                        float2 halfres = resolution.xy/2.0;
                        half2 cPos = IN.uv_MainTex;
                                               
                        cPos.x -= 0.5*halfres.x*sin(IN.t/2.0)+0.3*halfres.x*cos(IN.t)+halfres.x;
                        cPos.y -= 0.4*halfres.y*sin(IN.t/5.0)+0.3*halfres.y*cos(IN.t)+halfres.y;

                        float cLength = length(cPos);

                        float2 uv = IN.uv_MainTex.xy/resolution.xy+(cPos/cLength)*sin(cLength/30.0-IN.t*10.0)/25.0;
                        float3 col =c.rgb*5.0/cLength;

                        half4 color = half4(col,1.0);
                        o.Albedo = color.rgb;
                        o.Alpha = color.a;
                }
                ENDCG
        }
        FallBack "Diffuse"
}
 
Аватара пользователя
antonio
UNIт
 
Сообщения: 132
Зарегистрирован: 03 ноя 2009, 15:42
Откуда: Смоленск


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

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

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