Страница 1 из 1

MrTwister

СообщениеДобавлено: 23 окт 2010, 17:06
gnoblin
Передрал прикольный вертексный шейдер под названием "Мистер Твистер" из примеров нвидиа.

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

Плющит и крутит неплохо (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"
}

Re: MrTwister

СообщениеДобавлено: 23 окт 2010, 17:09
Neodrop
А демку слабо? :-?

Re: MrTwister

СообщениеДобавлено: 23 окт 2010, 17:11
gnoblin
На шарик повесь и всё :).
Я пока увлечен самим процессом создания, не до картинок.
Если есть добрые картино-демочные самаритяне - я не буду жаловаться).

Re: MrTwister

СообщениеДобавлено: 23 окт 2010, 17:17
gnoblin
попробую предположить, что

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);

---
Так, правда, у меня твистер начинает показывать объект в экранных координатах, поэтому либо я накосячил, либо мне нравится первый вариант шейдера ).