     vec2 uvY = ex_WorldPos.xz * uboDynamic.textureScale;
     vec2 uvZ = ex_WorldPos.xy * uboDynamic.textureScale;
 
-    vec3 geomNorm = ex_TBN[2];
+    vec3 geomNorm = normalize(ex_TBN[2]);
 
 	vec3 albedo;
     if (uboDynamic.enableAlbedoSampler)

		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;

		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 / max(blendWeights.x + blendWeights.y + blendWeights.z, 0.001);
		albedo = clamp(
				 albedoX * blendWeights.x +
				 albedoY * blendWeights.y +
				 albedoZ * blendWeights.z,
				 0.0, 1.0);
    }
    else
    {
