shader_type spatial; render_mode blend_mix,depth_draw_opaque,cull_back,diffuse_burley,specular_schlick_ggx; uniform vec4 albedo : hint_color; uniform sampler2D texture_grass : hint_albedo; uniform sampler2D texture_grass_25 : hint_albedo; uniform sampler2D texture_grass_height : hint_white; uniform sampler2D texture_dirt : hint_albedo; uniform sampler2D texture_dirt_height : hint_black; uniform sampler2D texture_hsv_mask : hint_white; uniform sampler2D texture_hsv2_mask : hint_white; uniform sampler2D texture_albedo_mix : hint_black; uniform sampler2D texture_mix_gradiant : hint_black; uniform sampler2D texture_mix_border : hint_black; uniform sampler2D texture_albedo_mix2 : hint_black; uniform float specular; uniform float metallic; uniform float roughness : hint_range(0,1); uniform float point_size : hint_range(0,128); uniform sampler2D texture_roughness : hint_white; uniform sampler2D texture_roughness_dirt : hint_white; uniform vec4 roughness_texture_channel; uniform sampler2D texture_normal : hint_normal; uniform sampler2D texture_normal_dirt : hint_normal; uniform float normal_scale : hint_range(-16,16); uniform sampler2D texture_ambient_occlusion : hint_white; uniform sampler2D texture_ambient_occlusion_dirt : hint_white; uniform vec4 ao_texture_channel; uniform float ao_light_affect; uniform vec3 uv1_scale; uniform vec3 uv1_offset; uniform vec3 uv2_scale; uniform vec3 uv2_offset; uniform vec3 hsv; uniform float grass_level = 1.0; uniform float angle = 0.0; varying vec2 base_uv; varying vec2 rotated_uv; varying vec2 rotated_uv_mask; varying float v_index; vec2 rotateUVmatrinx(vec2 uv, vec2 pivot, float rotation) { mat2 rotation_matrix=mat2( vec2(sin(rotation),-cos(rotation)), vec2(cos(rotation),sin(rotation)) ); uv -= pivot; uv= uv*rotation_matrix; uv += pivot; return uv; } vec2 rotateUV(vec2 uv, vec2 pivot, float rotation) { float sine = sin(rotation); float cosine = cos(rotation); uv -= pivot; uv.x = uv.x * cosine - uv.y * sine; uv.y = uv.x * sine + uv.y * cosine; uv += pivot; return uv; } vec3 rgb2hsv(vec3 c) { vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); float d = q.x - min(q.w, q.y); float e = 1.0e-10; return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); } vec3 hsv2rgb(vec3 c) { vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); } void vertex() { base_uv=UV*uv1_scale.xy+uv1_offset.xy; rotated_uv = rotateUVmatrinx(base_uv, vec2(0.5), (VERTEX.x)); // rotated_uv = base_uv; rotated_uv_mask = rotateUVmatrinx(UV, vec2(0.5), (VERTEX.x+10.0)); // rotated_uv_mask = UV; v_index = mod(VERTEX.x, 10.0); } void fragment() { // vec2 base_uv = UV; vec4 grass_tex = texture(texture_grass,base_uv); vec4 grass_25_tex = texture(texture_grass_25,base_uv); vec4 grass_height_tex = texture(texture_grass_height,base_uv); vec4 dirt_tex = texture(texture_dirt,base_uv); vec4 dirt_height_tex = texture(texture_dirt_height,base_uv); vec4 dirt_height_hsv_tex = texture(texture_dirt_height,rotated_uv_mask); vec4 hsv_mask_tex = texture(texture_hsv_mask,UV); vec4 hsv2_mask_tex = texture(texture_hsv2_mask,UV*vec2(5.0,5.0)); vec4 albedo_mix_tex; // if ( abs(v_index) > 1.28 ) // { // albedo_mix_tex = texture(texture_hsv_mask,UV); // } // else { albedo_mix_tex = texture(texture_albedo_mix,UV); } vec4 mix_gradiant_tex = texture(texture_mix_gradiant,vec2( albedo_mix_tex.r, albedo_mix_tex.r )); vec4 albedo_mix_tex_low = texture(texture_albedo_mix,UV*vec2(5.0,5.0)); vec4 mix_gradiant_low_tex = texture(texture_mix_gradiant,vec2( albedo_mix_tex_low.r, albedo_mix_tex_low.r )); vec4 mix_gradiant_border = texture(texture_mix_border,vec2( albedo_mix_tex_low.r, albedo_mix_tex_low.r )); vec4 albedo_mix_tex2 = texture(texture_albedo_mix2,base_uv); vec4 mix_gradiant2_tex = texture(texture_mix_gradiant,vec2( albedo_mix_tex2.r, albedo_mix_tex2.r )); ALBEDO = albedo.rgb * grass_tex.rgb; vec3 hsv_albedo = rgb2hsv(ALBEDO); vec3 hsv_mask = rgb2hsv( hsv_mask_tex.rgb ); vec3 hsv2_mask = rgb2hsv( hsv2_mask_tex.rgb ); hsv_albedo.x *= hsv.x; hsv_albedo.y = hsv.y; hsv_albedo.z *= hsv.z * (hsv_mask.z * hsv2_mask.z*2.0); ALBEDO = hsv2rgb( hsv_albedo ); vec4 mix_mix = mix( mix_gradiant_tex, mix_gradiant2_tex, 0.5 ); float mix_level = clamp( mix_gradiant_tex.r*mix_gradiant_border.r-grass_level, 0.0, 1.0 ); // if ( grass_height_tex.r > 0.5 ) // { //// mix_level = 0.0; // } // else // { // mix_level = 1.0; // } if ( mix_level > 0.0 && mix_level < 1.0 ) { if ( grass_height_tex.r < dirt_height_tex.r ) { mix_level = 1.0; } else { mix_level = 0.0; } } mix_level *= mix_level; mix_level *= mix_level; mix_level *= mix_level; vec3 hsv_dirt = rgb2hsv(dirt_tex.rgb); vec3 hsv_dirt_height = rgb2hsv(dirt_height_hsv_tex.rgb); hsv_dirt.y = hsv.y*hsv_mask.z; hsv_dirt.z *= hsv.z*hsv_mask.z; dirt_tex.rgb = hsv2rgb( hsv_dirt ); if ( mix_level >= 1.0 ) { ALBEDO = mix( ALBEDO, dirt_tex.rgb, mix_level ); } else if ( mix_level >= 0.1 ) { ALBEDO = mix( ALBEDO, grass_25_tex.rgb, mix_level ); } METALLIC = metallic; vec4 final_roughness = mix( texture(texture_roughness,base_uv),texture(texture_roughness_dirt,base_uv), mix_level ); ROUGHNESS = dot(final_roughness, roughness_texture_channel) * roughness; SPECULAR = specular; vec4 final_normal = mix( texture(texture_normal,base_uv), texture(texture_normal_dirt,base_uv), mix_level ); NORMALMAP = final_normal.rgb; NORMALMAP_DEPTH = normal_scale; vec4 final_ao = mix( texture(texture_ambient_occlusion,base_uv), texture(texture_ambient_occlusion_dirt,base_uv), mix_level ); AO = dot(final_ao,ao_texture_channel); AO_LIGHT_AFFECT = ao_light_affect; }