Шейдер реалистичных волн.

Полезная литература, исходники шейдеров из серьезных игр и других движков, ссылки на тематические ресурсы - всё здесь.

Шейдер реалистичных волн.

Сообщение Radiy 16 окт 2018, 16:47

Здравствуйте. Хотелось бы реализовать хаотичное расположение волн на плейне, но никак не могу использовать шум Пелинга. Помогите, пожалуйста, волны получаются периодичными, а нужна хаотичность. Код шейдера:
Shader "Radiy/Water" {
Properties {
_Color("Color", Color) = (0,0,0,1)
_Strength("Strength", Range(0,10)) = 1
_Frequency("Frequency", Range(0,10)) = 1
_Speed("Speed", Range(-200, 200)) = 100
_MainTex ("Base (RGB) TransGloss (A)", 2D) = "white" {}
_NormalMap ("Normal Map", 2D) = "white" {}
_Boost("Boost", Float) = 1
_Transparence("Transparence", Float) = 1
_A("Albedo", Range(0,1)) = 1
}
SubShader {
Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
LOD 300
Blend SrcAlpha OneMinusSrcAlpha
Pass {
Cull Off
CGPROGRAM
#pragma vertex vertexFunc
#pragma fragment fragmentFunc
#include "UnityCG.cginc"
float4 _Color;
float _Strength;
float _Frequency;
float _Boost;
float _Speed;
float _A;
float _Transparence;
sampler2D _MainTex;
float4 _MainTex_ST;
sampler2D _NormalMap;
float4 _NormalMap_ST;
float rand(float2 n) {
return frac(sin(dot(n, float2(12.9898, 4.1414))) * 43758.5453);
}
float noise(float2 n) {
const float2 d = float2(0.0, 1.0);
float2 b = floor(n), f = smoothstep(0, 1, frac(n));
return lerp(lerp(rand(b), rand(b + d.yx), f.x), lerp(rand(b + d.xy), rand(b + d.yy), f.x), f.y);
}
struct vertexInput{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float2 uv_normal : TEXCOORD1;
half3 normal : NORMAL;
half4 tangent : TANGENT;
};
struct vertexOutput{
float4 pos : SV_POSITION0;
float2 uv : TEXCOORD0;
float2 uv_normal : TEXCOORD1;
half3 tspace0 : TEXCOORD2;
half3 tspace1 : TEXCOORD3;
half3 tspace2 : TEXCOORD4;
half3 viewDir : TEXCOORD5;
half3 normalDir : TEXCOORD6;
};
vertexOutput vertexFunc(vertexInput IN)
{
vertexOutput o;
float4 worldPos = mul(unity_ObjectToWorld, IN.vertex);
//float displacement = (sin(worldPos.y + (_Speed * _Time)) + sin(worldPos.x + (_Speed * _Time)) + sin(worldPos.z + (_Speed * _Time)));
//worldPos.y = worldPos.y +(displacement * _Strength);
float displacement = sin(worldPos.y + (_Speed * _Time)) + sin(worldPos.x * rand(2.0) + (_Speed * _Time)) + sin(worldPos.z * rand(1.0) + (_Speed * _Time * _Frequency));
float displacement2 = cos(worldPos.y + (_Speed * _Time)) + cos(worldPos.x * rand(1.0) + (-_Speed * _Time)) + cos(worldPos.z * rand(2.0) + (_Speed * _Time * _Frequency));
worldPos.y = worldPos.y + (displacement * _Strength);
worldPos.y = worldPos.y + (displacement2 * _Strength/2);
o.pos = mul(UNITY_MATRIX_VP, worldPos);
o.uv = TRANSFORM_TEX(IN.uv, _MainTex);
o.uv_normal = TRANSFORM_TEX(IN.uv_normal, _NormalMap);
o.viewDir = normalize(ObjSpaceViewDir(IN.vertex));
o.normalDir = IN.normal;
half3 wNormal = UnityObjectToWorldNormal(IN.normal);
half3 wTangent = UnityObjectToWorldDir(IN.tangent.xyz);
half tangentSign = IN.tangent.w * unity_WorldTransformParams.w;
half3 wBitangent = cross(wNormal, wTangent) * tangentSign;
o.tspace0 = half3(wTangent.x, wBitangent.x, wNormal.x);
o.tspace1 = half3(wTangent.y, wBitangent.y, wNormal.y);
o.tspace2 = half3(wTangent.z, wBitangent.z, wNormal.z);
return o;
}
float4 fragmentFunc(vertexOutput IN) : SV_Target{
half3 tnormal = UnpackNormal(tex2D(_NormalMap, IN.uv_normal));
half3 worldNormal;
worldNormal.x = dot(IN.tspace0, tnormal);
worldNormal.y = dot(IN.tspace1, tnormal);
worldNormal.z = dot(IN.tspace2, tnormal);
half3 some = saturate(dot(IN.viewDir, IN.normalDir));
//float4 norms = float4(norm.x, norm.y+_Boost, norm.z, 0);
fixed4 col;
col.rgb = (tex2D(_MainTex, IN.uv) + some) * _Color;
col.a = _Transparence + _A;
return col;
}
ENDCG
}
}
Fallback "Transparent/VertexLit"
}
Radiy
UNIт
 
Сообщения: 63
Зарегистрирован: 10 сен 2017, 10:28

Вернуться в Шейдерная школа

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

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