Aller au contenu

Anti-aliasing spéculaire (Specular AA)

Ce document décrit le filtrage de variance pour l'anti-aliasing spéculaire (Specular Anti-Aliasing).

Problème : Aliasing spéculaire

Les matériaux à très faible rugosité (métaux polis, surfaces miroirs) présentent des highlights spéculaires très concentrées qui scintillent et s'aliasent aux hautes fréquences géométriques.

Solution : Filtrage Varef (variance-based roughness filtering)

L'approche Varef augmente localement la rugosité en fonction de la variance de la normale dans la micro-géométrie, amortissant les highlights spéculaires aux zones aliasées.

Formulation

float compute_specular_aa_roughness(vec3 N, float roughness)
{
    // Calculer la variance de la normale (via les dérivées écran-espace)
    vec3 dNdx = dFdx(N);
    vec3 dNdy = dFdy(N);

    float variance = dot(dNdx, dNdx) + dot(dNdy, dNdy);

    // Augmenter la rugosité proportionnellement à la variance
    float kernel_roughness = min(2.0 * variance, SPECULAR_AA_THRESHOLD);
    float filtered_roughness = sqrt(roughness * roughness + kernel_roughness);

    return clamp(filtered_roughness, 0.0, 1.0);
}

Modes d'activation

Mode Description Activation
Espace écran Basé sur dFdx/dFdy de la normale Par défaut
Courbure analytique Basé sur la courbure de la sphère Sphères uniquement
Désactivé Aucun filtrage spéculaire #undef ENABLE_SPECULAR_AA

Mode courbure pour les sphères

Pour les sphères, la courbure est analytiquement connue, permettant un filtrage plus précis sans dépendance sur les dérivées :

// Courbure d'une sphère de rayon r à une distance d
float curvature = 1.0 / (sphere_radius * sphere_radius);
float roughness_delta = SPECULAR_AA_SCALE * curvature;
float aa_roughness = sqrt(roughness * roughness + roughness_delta);

Constantes de réglage

Constante Valeur par défaut Effet
SPECULAR_AA_THRESHOLD 0.18 Plafond de la correction de rugosité
SPECULAR_AA_SCALE 8e-4 Intensité du mode courbure

Augmenter SPECULAR_AA_THRESHOLD réduit davantage le scintillement mais peut rendre les surfaces trop mates.

Compatibilité cross-GPU

Le mode basé sur les dérivées (dFdx/dFdy) peut diverger sur NVIDIA (voir gpu-rendering-synchronization.md). Dans les cas problématiques, utiliser le mode courbure analytique ou désactiver Specular AA.

Voir aussi