overte icon indicating copy to clipboard operation
overte copied to clipboard

expose normal map attenuation distance as zone property

Open HifiExperiments opened this issue 1 year ago • 0 comments

(from Nozajio on discord)

currently, normal maps falloff between 30 and 100 meters to avoid artifacts:

<@func evalMaterialNormalLOD(fragPosES, fetchedNormal, interpolatedNormal, interpolatedTangent, normal)@>
{
    vec3 normalizedNormal = normalize(<$interpolatedNormal$>.xyz);
    vec3 normalizedTangent = normalize(<$interpolatedTangent$>.xyz);
    vec3 normalizedBitangent = cross(normalizedNormal, normalizedTangent);
    // attenuate the normal map divergence from the mesh normal based on distance
    // The attenuation range [30,100] meters from the eye is arbitrary for now
    vec3 localNormal = mix(<$fetchedNormal$>, vec3(0.0, 1.0, 0.0), smoothstep(30.0, 100.0, (-<$fragPosES$>).z));
    <$normal$> = vec3(normalizedBitangent * localNormal.x + normalizedNormal * localNormal.y + normalizedTangent * localNormal.z);
}
<@endfunc@>

(also, localNormal should probably be renormalized at the end)

it might be complicated when/how we set them because the zones render separately from the individual models, somehow the state needs to be set globally or passed down

HifiExperiments avatar Sep 11 '24 19:09 HifiExperiments