shader_type spatial; render_mode cull_back, diffuse_burley; // Faceted low-poly rocks: triplanar grain, per-rock tint, moss on upward faces // (on some rocks more than others), snow on top at altitude. #include "res://shaders/common.gdshaderinc" uniform vec3 moss_col : source_color = vec3(0.27, 0.38, 0.15); uniform vec3 snow_col : source_color = vec3(0.93, 0.95, 0.98); uniform float snow_height = 40.0; varying vec3 w_pos; varying vec3 w_nrm; varying vec3 inst_pos; void vertex() { w_pos = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz; w_nrm = normalize((MODEL_MATRIX * vec4(NORMAL, 0.0)).xyz); inst_pos = MODEL_MATRIX[3].xyz; } void fragment() { float a = tri_nz(w_pos, w_nrm, 0.3); float b = tri_nz(w_pos, w_nrm, 1.4); vec3 base = to_linear(COLOR.rgb) * (0.7 + 0.6 * a) * (0.88 + 0.24 * b); base *= mix(vec3(1.04, 1.0, 0.94), vec3(0.94, 0.97, 1.03), nz(inst_pos.xz * 0.07)); float mossy = smoothstep(0.3, 0.7, nz(inst_pos.xz * 0.021 + 0.5)); float moss = smoothstep(0.45, 0.8, w_nrm.y + (a - 0.5) * 0.7) * mossy; vec3 col = mix(base, moss_col * (0.75 + 0.5 * b), moss); float snow = smoothstep(snow_height - 3.0, snow_height + 3.0, w_pos.y + (a - 0.5) * 10.0); snow *= smoothstep(0.35, 0.7, w_nrm.y); col = mix(col, snow_col, snow); ALBEDO = col; ROUGHNESS = mix(mix(0.8, 0.95, moss), 0.6, snow); SPECULAR = 0.35; }