MrTwister

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

MrTwister

Сообщение gnoblin 23 окт 2010, 17:06

Передрал прикольный вертексный шейдер под названием "Мистер Твистер" из примеров нвидиа.

В двух местах оставил оригинальные строчки (там какие-то проекции в оригинале использовались, я не знаю нужно это или нет + как это грамотно сделать... поэтому упростил, поэтому может работать не совсем как в оригинале).

Плющит и крутит неплохо (popcorn)

Синтаксис:
Используется glsl
Shader "MrTwister" {
        Properties {
                _TimeScaleH ("h",Float) = 1.0
                _TimeScaleV ("v",Float) = 2.7
                _Wobble ("w",Float) = 0.2
                _Horizontal ("H",Float) = 0.1
                _Vertical ("V",Float) = 0.2
                _Timer ("Timer",Float) = 0.2
               
        }
        SubShader {
                Tags { "RenderType"="Opaque" }
                LOD 200
               
                CGPROGRAM
                #pragma surface surf Lambert vertex:vert
               
        float _Timer;
        float _TimeScaleH;
                float _TimeScaleV;
                float _Wobble;
                float _Horizontal;
                float _Vertical;
                float _SpecExpon;
               
      struct Input {
                        float3 viewDir;
                };
     
      void vert (inout appdata_full v, out Input o) {
                       
                        //float4x4 WorldIT : WorldInverseTranspose
                        //float3 Nn = normalize(mul(IN.Normal, WorldIT).xyz);
                       
                        float3 Nn = normalize(v.normal);
                        float timeNowV = (_Timer*_TimeScaleV);
                        float timeNowH = (_Timer*_TimeScaleH);
                        float4 Po = float4(v.vertex.xyz,1);
                        float iny = Po.y * _Vertical + timeNowV;
                        float inxz = sqrt(dot(Po.xz,Po.xz)) * _Horizontal * timeNowH;
                        float hScale = _Wobble * (1.0+sin(inxz));
                        float wiggleX = sin(iny) * hScale;
                        float wiggleY = cos(iny) * hScale;
                        Po.x = Po.x + wiggleX;
                        Nn.y = Nn.y + wiggleY;
                        Nn = normalize(Nn);
                        Po.z = Po.z + wiggleY;
                       
                        //o.HPosition = mul(Po, WorldViewProj);
                        v.vertex.xyz = Po;     
      }
     
      void surf (Input IN, inout SurfaceOutput o)
      {
          o.Albedo = half3(0.5,0,0);
                 
      }
     
                ENDCG
        }
        FallBack "Diffuse"
}
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: MrTwister

Сообщение Neodrop 23 окт 2010, 17:09

А демку слабо? :-?
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: MrTwister

Сообщение gnoblin 23 окт 2010, 17:11

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

Re: MrTwister

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

попробую предположить, что

1) //float4x4 WorldIT : WorldInverseTranspose
//float3 Nn = normalize(mul(v.normal, WorldIT).xyz);

это не float3 Nn = normalize(v.normal);
а float3 Nn = normalize(mul(float4(v.normal,0), UNITY_MATRIX_IT_MV).xyz);

2) //v.vertex.xyz = mul(Po, WorldViewProj);

это не v.vertex.xyz = Po;
а v.vertex.xyz = mul(Po, UNITY_MATRIX_MVP);

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


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

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

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