I wanted to get a cool water shader for my game so I went to godotshaders.com and found this one added it to the game and did some modifications to add triplaner mapping to the texturing,
shader_type spatial;
render_mode blend_mix, specular_phong;
uniform float speed : hint_range(-1,1) = 0.0;
//colors
uniform sampler2D noise1; //add Godot noise here
uniform sampler2D noise2; //add Godot noise here
uniform sampler2D normalmap : hint_normal; //add Godot noise here, enable as_normalmap
uniform vec4 color : hint_color;
uniform vec4 edge_color : hint_color;
//foam
uniform float edge_scale = 0.25;
uniform float near = 0.1;
uniform float far = 100.0;
//waves
uniform vec2 wave_strengh = vec2(0.5, 0.25);
uniform vec2 wave_frequency = vec2(12.0, 12.0);
uniform vec2 time_factor = vec2(1.0, 2.0);
varying vec3 uv1_triplanar_pos;
varying vec3 uv1_power_normal;
uniform vec3 uv1_scale = vec3(1.0,1.0,1.0);
uniform vec3 uv1_offset = vec3(0.0,0.0,0.0);
float rim(float depth){
depth = 2.0 * depth - 1.0;
return near * far / (far + depth * (near - far));
}
float waves(vec2 pos, float time){
return (wave_strengh.y * sin(pos.y * wave_frequency.y + time * time_factor.y)) + (wave_strengh.x * sin(pos.x * wave_frequency.x + time * time_factor.x));
}
vec4 tri_map (sampler2D p_sampler,vec3 p_triplanar_pos) {
vec4 samp=vec4(0.0);
samp+= texture(p_sampler,p_triplanar_pos.xy) * uv1_power_normal.z;
samp+= texture(p_sampler,p_triplanar_pos.xz) * uv1_power_normal.y;
samp+= texture(p_sampler,p_triplanar_pos.zy * vec2(-1.0,1.0)) * uv1_power_normal.x;
return samp;
}
void vertex(){
VERTEX.y += waves(VERTEX.xy, TIME);
TANGENT = vec3(0.0,0.0,-1.0) * abs(NORMAL.x);
TANGENT+= vec3(1.0,0.0,0.0) * abs(NORMAL.y);
TANGENT+= vec3(1.0,0.0,0.0) * abs(NORMAL.z);
TANGENT = normalize(TANGENT);
BINORMAL = vec3(0.0,1.0,0.0) * abs(NORMAL.x);
BINORMAL+= vec3(0.0,0.0,-1.0) * abs(NORMAL.y);
BINORMAL+= vec3(0.0,1.0,0.0) * abs(NORMAL.z);
BINORMAL = normalize(BINORMAL);
uv1_power_normal=pow(abs(NORMAL),vec3(1.0));
uv1_power_normal/=dot(uv1_power_normal,vec3(1.0));
uv1_triplanar_pos = VERTEX * uv1_scale + (uv1_offset + vec3(0.0,sin(TIME*speed*4.0),0.0));
uv1_triplanar_pos *= vec3(1.0,-1.0, 1.0);
}
void fragment(){
float time = TIME * speed;
vec3 n1 = tri_map(noise1, uv1_triplanar_pos + time).rgb;
vec3 n2 = tri_map(noise2, uv1_triplanar_pos - time * 0.2).rgb;
vec2 uv_movement = UV * 4.0;
uv_movement += TIME * speed * 4.0;
float sum = (n1.r + n2.r) - 1.0;
float z_depth = rim(texture(DEPTH_TEXTURE, SCREEN_UV).x);
float z_pos = rim(FRAGCOORD.z);
float diff = z_depth - z_pos;
vec2 displacement = vec2(sum * 0.05);
diff += displacement.x * 50.0;
vec4 col = mix(edge_color, color, step(edge_scale, diff));
vec4 alpha = texture(SCREEN_TEXTURE, SCREEN_UV + displacement);
float fin = 0.0;
if (sum > 0.0 && sum < 0.4) fin = 0.1;
if (sum > 0.4 && sum < 0.8) fin = 0.0;
if (sum > 0.8) fin = 1.0;
ALBEDO = vec3(fin) + mix(alpha.rgb, col.rgb, color.a);
NORMALMAP = tri_map(normalmap, uv1_triplanar_pos).rgb;
ROUGHNESS = 0.1;
SPECULAR = 1.0;
}
up till this point I had been testing the shader on a cube, when I added the finished shader to my actual mesh it made a weird effect of having the closest side be pushed inwards to the back of the mesh
And for refrence heres how the mesh should be (not talking about the colours just where the vertexs are)
after a bunch of investing I coulden`t find a cause to this.
For a bit I thought it was on line 72 which had it take the depth texture but that wasent it and tried making the fragment shader not set the albedo or colours but it didnt do it either.
It`d be a great help for any advise on this situation or how to fix it.
Link to project file:
https://drive.google.com/drive/folders/1t9A5aZUKrdPq4e9qP4OdJOdJp_TRh3j9?usp=share_link
(thanks Megalomniak)