101 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			101 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
|   | // NOTE: Shader automatically converted from Godot Engine 4.4.stable.mono's StandardMaterial3D. | ||
|  | 
 | ||
|  | shader_type spatial; | ||
|  | render_mode blend_mix, depth_draw_opaque, cull_back, diffuse_burley, specular_schlick_ggx; | ||
|  | 
 | ||
|  | #include "res://addons/rokojori_action_library/Runtime/Shading/Library/Math.gdshaderinc" | ||
|  | #include "res://addons/rokojori_action_library/Runtime/Shading/Library/Transform.gdshaderinc" | ||
|  | #include "res://addons/rokojori_action_library/Runtime/Shading/Library/Noise.gdshaderinc" | ||
|  | #include "res://addons/rokojori_action_library/Runtime/Shading/Library/Light.gdshaderinc" | ||
|  | 
 | ||
|  | 
 | ||
|  | uniform vec4 albedo : source_color; | ||
|  | uniform sampler2D depthTexture:hint_depth_texture; | ||
|  | uniform sampler2D screenTexture:hint_screen_texture; | ||
|  | 
 | ||
|  | uniform float roughness : hint_range(0.0, 1.0); | ||
|  | uniform float specular : hint_range(0.0, 1.0, 0.01); | ||
|  | uniform float metallic : hint_range(0.0, 1.0, 0.01); | ||
|  | 
 | ||
|  | uniform float normal_scale : hint_range(-16.0, 16.0); | ||
|  | 
 | ||
|  | uniform sampler2D waterNoiseOffset : source_color, filter_linear_mipmap, repeat_enable; | ||
|  | uniform sampler2D waterNoiseNormal : hint_roughness_normal, filter_linear_mipmap, repeat_enable; | ||
|  | uniform float waterNoiseScale; | ||
|  | uniform float waterNoiseWaveHeight; | ||
|  | uniform vec2 waterNoiseScroll; | ||
|  | varying vec2 waterUV; | ||
|  | uniform float sinkStart; | ||
|  | uniform float sinkEnd; | ||
|  | uniform float sinkOffset; | ||
|  | uniform float sinkBend: hint_range(0.0, 1.0) = 0.5; | ||
|  | uniform vec4 deepWater:source_color;  | ||
|  | varying float deepWaterAmount; | ||
|  | uniform vec4 centerWater:source_color;  | ||
|  | varying float centerWaterAmount; | ||
|  | uniform vec4 fromTopColor:source_color; | ||
|  | varying vec3 world_position; | ||
|  | uniform float alphaFadeDistance = 10; | ||
|  | uniform float albedoFadeDistance = 10; | ||
|  | 
 | ||
|  | void vertex() | ||
|  | { | ||
|  | 
 | ||
|  |   vec3 worldPosition = ( vec4( VERTEX, 1 ) * MODEL_MATRIX ).xyz; | ||
|  |   UV = worldPosition.xz * waterNoiseScale + waterNoiseScroll * TIME; | ||
|  |   float heightAmount = texture( waterNoiseOffset, UV ).r; | ||
|  |   VERTEX.y += heightAmount * waterNoiseWaveHeight; | ||
|  |    | ||
|  |   deepWaterAmount = 1.0 - heightAmount; | ||
|  |    | ||
|  |    | ||
|  |      | ||
|  |   float d = length( worldPosition ); | ||
|  |   float m = mapClamped( d, sinkStart, sinkEnd, 0, 1 ); | ||
|  |   centerWaterAmount = 1.0 - m; | ||
|  |   m = mix( m, m*m*m, sinkBend ); | ||
|  |   float offset = mix( 0, sinkOffset, m ); | ||
|  |   VERTEX.y += offset; | ||
|  |    | ||
|  |    world_position = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz; | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | void fragment() | ||
|  | { | ||
|  |   float depth = texture(depthTexture, SCREEN_UV).x; | ||
|  |   vec3 ndc = vec3(SCREEN_UV * 2.0 - 1.0, depth); | ||
|  |   vec4 view = INV_PROJECTION_MATRIX * vec4(ndc, 1.0); | ||
|  |   view.xyz /= view.w; | ||
|  |   float linear_depth = -view.z; | ||
|  | 
 | ||
|  |   vec4 world = INV_VIEW_MATRIX * INV_PROJECTION_MATRIX * vec4(ndc, 1.0); | ||
|  |   vec3 worldPosition = world.xyz / world.w; | ||
|  |      | ||
|  |   float depthDistance = length( worldPosition - world_position ); | ||
|  |   float alphaFade = 1.0 - clamp( depthDistance / alphaFadeDistance, 0, 1 ); | ||
|  |   float albedoFade = 1.0 - clamp( depthDistance * 5.0 / albedoFadeDistance , 0, 1 ); | ||
|  | 	vec2 base_uv = UV; | ||
|  |   float fresnelAmount = 1.0 - fresnel( NORMAL, VIEW, 3 ); | ||
|  | 	ALBEDO = mix( albedo.rgb, deepWater.rgb, deepWaterAmount * deepWater.a ); | ||
|  |   ALBEDO = mix( ALBEDO, centerWater.rgb, centerWaterAmount * centerWater.a ); | ||
|  |   //ALBEDO = mix( ALBEDO, texture( screenTexture, SCREEN_U | ||
|  |   vec3 screenRGB = mix( texture( screenTexture, SCREEN_UV ).rgb*2.0, vec3( 1,1,1 ), 0.5) ; | ||
|  |   ALBEDO = mix( ALBEDO, screenRGB, albedoFade ); | ||
|  |   //ALBEDO = vec3( 1, 1, 1 ) * worldDistance; | ||
|  |    | ||
|  | 	METALLIC = mix( metallic, 0, albedoFade );; | ||
|  | 	SPECULAR = mix( specular, 0, albedoFade ); | ||
|  | 
 | ||
|  | 	ROUGHNESS = mix( roughness, 1, albedoFade ); | ||
|  |    | ||
|  |    | ||
|  |   vec3 waterNormal = texture( waterNoiseNormal, UV ).rgb; | ||
|  |    | ||
|  | 	NORMAL_MAP =  waterNormal; | ||
|  | 	NORMAL_MAP_DEPTH = normal_scale; | ||
|  |    | ||
|  |   ALPHA = 1.0 - alphaFade; | ||
|  | 
 | ||
|  | } |