MrTwister
Добавлено: 23 окт 2010, 17:06
Передрал прикольный вертексный шейдер под названием "Мистер Твистер" из примеров нвидиа.
В двух местах оставил оригинальные строчки (там какие-то проекции в оригинале использовались, я не знаю нужно это или нет + как это грамотно сделать... поэтому упростил, поэтому может работать не совсем как в оригинале).
Плющит и крутит неплохо
В двух местах оставил оригинальные строчки (там какие-то проекции в оригинале использовались, я не знаю нужно это или нет + как это грамотно сделать... поэтому упростил, поэтому может работать не совсем как в оригинале).
Плющит и крутит неплохо
Синтаксис:
Используется 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"
}
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"
}