Je préviens tout de suite : #noob#, je fais juste quelques tests avec WebGL pour voir ce que ça permettra de faire une fois que ça sera supporté officiellement par les navigateurs.
Dans mon fragment shader, je cherche à appliquer une lumière spéculaire en utilisant une gloss map (ou specular map ? je ne sais pas s'il y a une appellation officielle, mais il s'agit de la texture qui spécifie quelles sont les zones les plus réfléchissantes de mon matériau). La formule que je retrouve partout, et qui fonctionne presque très bien, est :
specularLightPower = pow (cosine, texture2D (glossMap, fragCoord).r * materialShininess);
Où "cosine" est le cosinus (> 0) entre mon angle de vue et l'angle de réflexion de la lumière, "materialShininess" est la valeur de réflexion de base du matériau, et "glossMap" est ma gloss map qui permet de faire varier la réflexion de base (j'ai choisi arbitrairement la couleur rouge pour représenter le coefficient de réflexion).
Le souci c'est que si ma gloss map contient des points où la composante rouge est nulle, alors je fais un "pow (cosine, 0)" et je me retrouve avec une lumière maximale même si le cosinus était très faible au départ, ce qui me fait des petits points blancs qui apparaissent (cf. screenshot). [edit] c'est encore plus flagrant si je n'active que la gloss map : screenshot.
Alors déjà est-ce que je m'y prends comme un pied, et est-ce qu'il y a une façon élégante d'éviter ce problème ? (je pourrais éviter d'avoir des points où r=0 sur ma texture, ou bien ajouter une constante très faible à chaque point, mais c'est pas top comme solution je trouve).
Merci
