31 lines
1.0 KiB
GLSL
31 lines
1.0 KiB
GLSL
float ao = smoothstep(0.0, 0.7, vGrassUv.y);
|
|
ao = mix(0.05, 1.0, pow(ao, 1.6));
|
|
|
|
vec3 rootColor = diffuseColor.rgb * 0.15;
|
|
vec3 midColor = diffuseColor.rgb;
|
|
vec3 tipColor = diffuseColor.rgb * 1.3 + vec3(0.06, 0.08, 0.0);
|
|
|
|
float heightParam = vGrassUv.y;
|
|
vec3 grassColor;
|
|
if (heightParam < 0.4) {
|
|
float t = smoothstep(0.0, 0.4, heightParam);
|
|
grassColor = mix(rootColor, midColor, t);
|
|
} else {
|
|
float t = smoothstep(0.4, 1.0, heightParam);
|
|
grassColor = mix(midColor, tipColor, t);
|
|
}
|
|
|
|
vec3 viewDir = normalize(cameraPosition - vWorldPos);
|
|
vec3 lightDir = normalize(vec3(15.0, 25.0, 15.0));
|
|
|
|
float VdotL = max(0.0, dot(viewDir, -lightDir));
|
|
float sss = pow(VdotL, 3.0) * smoothstep(0.2, 0.9, vGrassUv.y);
|
|
|
|
vec3 sssColor = diffuseColor.rgb * vec3(0.6, 1.0, 0.15) * 1.8;
|
|
grassColor += sssColor * sss * 2.0;
|
|
|
|
float NdotV = 1.0 - max(0.0, dot(normalize(vNormal), viewDir));
|
|
float rim = pow(NdotV, 3.0) * smoothstep(0.3, 1.0, vGrassUv.y) * 0.15;
|
|
grassColor += vec3(0.3, 0.5, 0.1) * rim;
|
|
|
|
diffuseColor.rgb = grassColor * ao; |