Un ombrage pas si doux
Question
Ombrage Blinn-phong...?
Donc, le problème que j'ai, comme l'image ci-dessus l'illustre, je l'espère, est que je n'arrive pas à obtenir une ombre fluide de mes reflets spéculaires.Le problème est la coupure abrupte le long des bords des faces, ce qui ne devrait pas se produire.L'éclairage diffus semble fonctionner plutôt bien et utilise les mêmes valeurs interpolées.Voici le code pour les reflets spéculaires de blinn-phong :
vec3 halfAngle = normalize(lightDirection.xyz + viewRay);
float blinnTerm = dot(normal.xyz, halfAngle);
blinnTerm = clamp(blinnTerm, 0.0f, 1.0f);
blinnTerm = pow(blinnTerm, 300.0f);
float specIntensity = intensity * blinnTerm;
vec4 specColour = specIntensity * specColour;
lightDirection
est constant, c'est infiniment loin (c.-à-d.le soleil).Quant à viewRay, il est calculé dans le vertex shader comme ceci, en utilisant la matrice de projection :
viewRay = vec3(-(UV.x * 2.0f - 1.0f) / projection[0].x,
-(UV.y * 2.0f - 1.0f) / projection[1].y,
1.0f);
J'utilise le rendu différé, d'où proviennent les valeurs UV (rendu vers une texture plein écran).
La seule chose à laquelle je peux penser, c'est que l'interpolation normale n'est tout simplement pas assez fluide.Mais si tel est le cas, comment pourrais-je y remédier ?(Je stocke les normales sous forme de flottants 16 bits, mais les augmenter à 32 bits n'a pas fait de différence).
La solution
Et la théière est désormais réparée !Là était un problème avec l'interpolation des normales, mais heureusement, c'était une solution facile ;Je normalisais les normales dans mon vertex shader, puis interpolais, plutôt que d'interpoler d'abord puis de normaliser.Ce n'est pas encore parfait, mais c'est certainement une amélioration !
La leçon ici : si votre image semble plate, vous faites probablement quelque chose que vous ne devriez pas faire dans le vertex shader.