 		vec3 albedoY = texture(albedoSampler, uvY).rgb * uboDynamic.constAlbedo.rgb;
 		vec3 albedoZ = texture(albedoSampler, uvZ).rgb * uboDynamic.constAlbedo.rgb;
 		vec3 blendWeights = pow(abs(geomNorm), vec3(uboDynamic.blendSharpness));
-		blendWeights = blendWeights / (blendWeights.x + blendWeights.y + blendWeights.z);
-		albedo = albedoX * blendWeights.x +
+		blendWeights = blendWeights / max(blendWeights.x + blendWeights.y + blendWeights.z, 0.001);
+		albedo = clamp(
+				 albedoX * blendWeights.x +
 				 albedoY * blendWeights.y +
-				 albedoZ * blendWeights.z;
+				 albedoZ * blendWeights.z,
+				 0.0, 1.0);
     }
     else
     {

		vec3 normalY = ex_TBN * (texture(normalSampler, uvY).xyz * 2 - 1);
		vec3 normalZ = ex_TBN * (texture(normalSampler, uvZ).xyz * 2 - 1);
		vec3 blendWeights = pow(abs(geomNorm), vec3(uboDynamic.blendSharpness));
		blendWeights = blendWeights / (blendWeights.x + blendWeights.y + blendWeights.z);
		N = normalX * blendWeights.x +
			normalY * blendWeights.y +
			normalZ * blendWeights.z;

    vec2 uvY = ex_WorldPos.xz * uboDynamic.textureScale;
    vec2 uvZ = ex_WorldPos.xy * uboDynamic.textureScale;

    vec3 geomNorm = normalize(ex_TBN[2]);

	vec3 albedo;
    if (uboDynamic.enableAlbedoSampler)
