Дополнить шейдер флага [РЕШЕНО]

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

Дополнить шейдер флага [РЕШЕНО]

Сообщение Ert Donuell 18 фев 2011, 12:02

Нарыл чудесный шейдер флага:

Синтаксис:
Используется glsl
// Upgrade NOTE: replaced 'glstate.matrix.mvp' with 'UNITY_MATRIX_MVP'

// Original shader by cboe - Mar, 23, 2009
// Enhanced to 3 axis movement by Seon - Jan, 21, 2010
// Added _WaveSpeed - Jan, 26, 2010 Eric5h5
// Ajustement time function - April, 19, 2010 Fontmaster
//
// Requirements: assumes you are using a subdivided plane created with X (width) * Z (height) where Y is flat.
// Requirements: assumes UV as: left X (U0) is attatched to pole, and Top Z (V1) is at top of pole.
//
// Enjoy!

Shader "FX/FlagWave"
{

Properties
{
    _Color ("Main Color", Color) = (1,1,1,1)
    _MainTex ("Texture", 2D) = "white" { }
    _WaveSpeed ("Wave Speed", float) = 50.0
}

SubShader
{
    Pass
    {
       CULL Off
       
      CGPROGRAM
      #pragma vertex vert
      #pragma fragment frag
      #include "UnityCG.cginc"
      #include "AutoLight.cginc"
       
      float4 _Color;
      sampler2D _MainTex;
      float _WaveSpeed;

      // vertex input: position, normal
      struct appdata {
          float4 vertex : POSITION;
          float4 texcoord : TEXCOORD0;
      };
       
      struct v2f {
          float4 pos : POSITION;
          float2 uv: TEXCOORD0;
      };
       
      v2f vert (appdata v) {
          v2f o;

        float sinOff=v.vertex.x+v.vertex.y+v.vertex.z;
        float t=_Time*_WaveSpeed;
        if(t < 0.0) t *= -1.0;
        float fx=v.texcoord.x;
        float fy=v.texcoord.x*v.texcoord.y;

        v.vertex.x+=sin(t*1.45+sinOff)*fx*0.5;
        v.vertex.y=sin(t*3.12+sinOff)*fx*0.5-fy*0.9;
        v.vertex.z-=sin(t*2.2+sinOff)*fx*0.2;
   
          o.pos = mul( UNITY_MATRIX_MVP, v.vertex );
          o.uv = v.texcoord;

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

      ENDCG

      SetTexture [_MainTex] {combine texture}
    }
}
   Fallback "VertexLit"
}
 


Очень захотелось анимированные тени. Нарыл что его каким-то образом нужно сделать transparent. В шейдерах полный нуб. Помогите пожалуйста!
Последний раз редактировалось Ert Donuell 19 фев 2011, 22:06, всего редактировалось 1 раз.
Добавить dmitrii.baranov.yumasoft в Skype
Аватара пользователя
Ert Donuell
Старожил
 
Сообщения: 781
Зарегистрирован: 05 июл 2010, 09:50
Откуда: Санкт-Петербург
  • ICQ

Re: Дополнить шейдер флага

Сообщение gnoblin 18 фев 2011, 12:38

1. Надо взять из справки пример про сурфейс шейдер где надувается лицо солдата (там подсмотреть как добавлять манипуляции над вершинами в surface shader).
2. Взять исходник transparent шейдера, добавить туда вершинный кусок кода из п.1 - проверить что работает.
3. Потом заменить вершинную часть на кусок кода (vert()) из первого поста в теме (+ не забыть добавить переменную _WaveSpeed).
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Дополнить шейдер флага

Сообщение Ert Donuell 18 фев 2011, 12:39

Огромное спасибо, сейчас буду копать)
Добавить dmitrii.baranov.yumasoft в Skype
Аватара пользователя
Ert Donuell
Старожил
 
Сообщения: 781
Зарегистрирован: 05 июл 2010, 09:50
Откуда: Санкт-Петербург
  • ICQ

Re: Дополнить шейдер флага

Сообщение gnoblin 18 фев 2011, 12:41

Стоп)).

Если сделать его транспарентом - никаких теней не будет.

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

Re: Дополнить шейдер флага

Сообщение Ert Donuell 18 фев 2011, 12:53

это где в конце написано "Fallback "Diffuse""?
Добавить dmitrii.baranov.yumasoft в Skype
Аватара пользователя
Ert Donuell
Старожил
 
Сообщения: 781
Зарегистрирован: 05 июл 2010, 09:50
Откуда: Санкт-Петербург
  • ICQ

Re: Дополнить шейдер флага

Сообщение gnoblin 18 фев 2011, 17:43

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

Re: Дополнить шейдер флага

Сообщение Ert Donuell 18 фев 2011, 23:31

Строил на основе этого Diffuse шейдера:

Синтаксис:
Используется glsl
Shader "Diffuse" {
Properties {
        _Color ("Main Color", Color) = (1,1,1,1)
        _MainTex ("Base (RGB)", 2D) = "white" {}
}
SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200

CGPROGRAM
#pragma surface surf Lambert

sampler2D _MainTex;
fixed4 _Color;

struct Input {
        float2 uv_MainTex;
};

void surf (Input IN, inout SurfaceOutput o) {
        fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
        o.Albedo = c.rgb;
        o.Alpha = c.a;
}
ENDCG
}

Fallback "VertexLit"
}
 


Вот что получил:
Синтаксис:
Используется glsl
Shader "WavedFlag"
{
        Properties
        {
                _Color ("Main Color", Color) = (1,1,1,1)
                _MainTex ("Base (RGB)", 2D) = "white" {}
                _WaveSpeed ("Wave Speed", float) = 50.0
        }
        SubShader
        {
                Tags { "RenderType"="Opaque" }
                LOD 200
                CULL Off

                CGPROGRAM
                #pragma surface surf Lambert vertex:vert

                sampler2D _MainTex;
                fixed4 _Color;

                struct Input
                {
                        float2 uv_MainTex;
                };
               
                float _WaveSpeed;
                void vert (inout appdata_full v)
                {
                        float sinOff = v.vertex.x + v.vertex.y + v.vertex.z;
                        float t = _Time * _WaveSpeed;
                        if (t < 0.0) t *= -1.0;
                        float fx = v.texcoord.x;
                        float fy = v.texcoord.x * v.texcoord.y;
                        v.vertex.x += sin(t * 1.45 + sinOff) * fx * 0.5;
                        v.vertex.y = sin(t * 3.12 + sinOff) * fx * 0.5 - fy * 0.9;
                        v.vertex.z -= sin(t * 2.2 + sinOff) * fx * 0.2;
                }

                void surf (Input IN, inout SurfaceOutput o)
                {
                        fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
                        o.Albedo = c.rgb;
                        o.Alpha = c.a;
                }
                ENDCG
        }

        Fallback "VertexLit"
}
 


Не пашет :(
Ещё и ошибку выдаёт:
Maximum number (32) of shader keywords exceeded, keyword SOFTPARTICLES_OFF will be ignored
Добавить dmitrii.baranov.yumasoft в Skype
Аватара пользователя
Ert Donuell
Старожил
 
Сообщения: 781
Зарегистрирован: 05 июл 2010, 09:50
Откуда: Санкт-Петербург
  • ICQ

Re: Дополнить шейдер флага

Сообщение gnoblin 19 фев 2011, 00:15

странный текст в ошибке ).

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

Re: Дополнить шейдер флага

Сообщение Ert Donuell 19 фев 2011, 00:25

Не, та же фигня
Добавить dmitrii.baranov.yumasoft в Skype
Аватара пользователя
Ert Donuell
Старожил
 
Сообщения: 781
Зарегистрирован: 05 июл 2010, 09:50
Откуда: Санкт-Петербург
  • ICQ

Re: Дополнить шейдер флага

Сообщение gnoblin 19 фев 2011, 12:21

Я открыл шейдер в 3.1, заменил fixed4 в двух местах на float4 и всё ок.

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

Re: Дополнить шейдер флага

Сообщение gnoblin 19 фев 2011, 12:23

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

Re: Дополнить шейдер флага

Сообщение Ert Donuell 19 фев 2011, 14:27

Исправил, вот что получилось:

Синтаксис:
Используется glsl
Shader "WavedFlag"
{
        Properties
        {
                _Color ("Main Color", Color) = (1,1,1,1)
                _MainTex ("Base (RGB)", 2D) = "white" {}
                _WaveSpeed ("Wave Speed", float) = 50.0
                _Distortion ("Flag Distortion", Range(0.01,1)) = 0.05
        }
        SubShader
        {
                Tags { "RenderType"="Opaque" }
                LOD 200
                CULL Off

                CGPROGRAM
                #pragma surface surf Lambert vertex:vert

                sampler2D _MainTex;
                float4 _Color;
                struct Input
                {
                        float2 uv_MainTex;
                };

                float _WaveSpeed;
                float _Distortion;
                void vert (inout appdata_full v)
                {
                        float sinOff = v.vertex.x + v.vertex.y + v.vertex.z;
                        float t = _Time * _WaveSpeed;
                        if (t < 0.0) t *= -1.0;
                        float fx = v.texcoord.x;
                        float fy = v.texcoord.x * v.texcoord.y;
                        v.vertex.x += sin(t * 1.45 + sinOff) * fx * 5 * _Distortion;
                        v.vertex.y = sin(t * 3.12 + sinOff) * fx * 5 * _Distortion - fy * 9 * _Distortion;
                        v.vertex.z -= sin(t * 2.2 + sinOff) * fx * 2 * _Distortion;
                }

                void surf (Input IN, inout SurfaceOutput o)
                {
                        float4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
                        o.Albedo = c.rgb;
                        o.Alpha = c.a;
                }
                ENDCG
        }
        Fallback "VertexLit"
}
 


По-прежнему не работает ~x(
Добавить dmitrii.baranov.yumasoft в Skype
Аватара пользователя
Ert Donuell
Старожил
 
Сообщения: 781
Зарегистрирован: 05 июл 2010, 09:50
Откуда: Санкт-Петербург
  • ICQ

Re: Дополнить шейдер флага

Сообщение gnoblin 19 фев 2011, 15:56

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

Re: Дополнить шейдер флага

Сообщение Ert Donuell 19 фев 2011, 16:03

Можно Ваш? ;;)
Добавить dmitrii.baranov.yumasoft в Skype
Аватара пользователя
Ert Donuell
Старожил
 
Сообщения: 781
Зарегистрирован: 05 июл 2010, 09:50
Откуда: Санкт-Петербург
  • ICQ

Re: Дополнить шейдер флага

Сообщение gnoblin 19 фев 2011, 18:29

По-прежнему не работает


скопипастил из этого поста, запустил в 3.1 - работает.

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

След.

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

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

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