- Home /
Water displacement in shader with floating objects?
I'm using the Standard Assets Water Pro, and having fun trying to hack it!
I added waves (displacement) in the Water Pro vertex shader as follows:
v2f vert(appdata v) {
v2f o;
float4 wpos = mul(unity_ObjectToWorld, v.vertex);
wpos.y += sin(wpos.z + _Time.y);
v.vertex = mul(unity_WorldToObject, wpos);
// The rest of the shader is unchanged, but here is where the vertex data
// shows up again:
o.pos = UnityObjectToClipPos(v.vertex);
UNITY_INITIALIZE_OUTPUT(Input, o);
UNITY_TRANSFER_FOG(o,o.pos);
return o;
}
It works great, the water is nice and wavy. Then I wanted to make an object float on this water, so I modified a basic surface shader as follows:
void vert(inout appdata_full v, out Input o) {
float4 wpos = mul(unity_ObjectToWorld, v.vertex);
wpos.y += sin(wpos.z + _Time.y);
v.vertex = mul(unity_WorldToObject, wpos);
UNITY_INITIALIZE_OUTPUT(Input, o);
}
void surf(Input IN, inout SurfaceOutput o) {
fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
o.Albedo = c.rgb;
o.Alpha = c.a;
}
It almost works, but as depicted in the linked video, the floating objs are out of sync with the waves: WaterGifAnim
I tried tweaking the floating obj shader to scale the input to the`sin` function and add an offset in order to match the water waves:
wpos.y += sin(wpos.z * _Scale + _Offset + _Time.y);
Without the _Time.y
var in both shaders, I was able to position the floating objects exactly where they should be.
But adding the _Time.y
var back to the sin
functions broke the wave patterns again on the floating objects.
I thought that using the world z
coordinate on each vertice and the time constant would bring the two shader animations in perfect sync.
I'm still fairly new to shader coding, so I must be missing something obvious?
Your answer
Follow this Question
Related Questions
Weird Vertex Shader Behaviour 0 Answers
'vert': output parameter 'o' not completely initialized 2 Answers
Geometry Shader misses vertices problem. 2 Answers
Multiple instances of one shader, and merging shaders on model? 0 Answers
Set PSIZE in Surface shader 0 Answers