J'ai joué avec le mapping d'ombres dans OpenGL en utilisant des textures de profondeur. La texture de la profondeur est fine et je peux la cartographier sur la scène mais j'ai des objets étranges à l'arrière de l'objet:
Ma question est de savoir ce qui cause cela et comment puis-je y remédier?
Le shader de fragment que j'utilise est assez simple (j'ai supprimé la couleur pour plus de simplicité au cas où vous vous demanderiez pourquoi il n'y a pas de bleu ici):
in vec4 vShadowCoord;
uniform sampler2DShadow shadowMap;
out vec4 fragColor;
void main()
{
float bias = 0.005;
float visibility = 1.0;
if (texture(shadowMap, vec3(vShadowCoord.xy, vShadowCoord.z / vShadowCoord.w)) < (vShadowCoord.z - bias) / vShadowCoord.w)
visibility = 0.25;
fragColor = vec4(visibility);
}
Modifier: comme demandé, capture d'écran exemple de travail minimum qui utilise uniquement le code ci-dessus (pas de couleur).
opengl
glsl
shadow-mapping
shadow
Blarglenarf
la source
la source
Réponses:
Ce problème ressemble à des artefacts d'acné de carte d'ombre standard. De plus, l'équation d'éclairage de votre est incomplète ou erronée. La lumière ne doit pas influencer les visages avec les normales à l'opposé. Cela signifie également qu'avec une équation appropriée, le côté "sombre" de la sphère ne devrait pas avoir d'artefacts d'acné.
Il existe trois sources d'artefacts liés à l'acné:
Pour résumer, un tronc serré avec quelques cascades et quelques ajustements de biais est suffisant pour faire fonctionner le boîtier général (lumière directionnelle). Commencez à peaufiner en désactivant le filtrage des ombres et à ajuster le filtrage uniquement lorsque les cartes d'ombres de base sont suffisamment robustes.
En plus du biais de profondeur constante (que vous utilisez actuellement), vous devez également ajouter un biais de profondeur de pente et un biais de profondeur de pente max. Les deux peuvent être implémentés en tant qu'état de rendu ou en tant que code de shader lors du rendu de la shadowmap. Le biais de profondeur de pente est simplement une valeur de biais magique mise à l'échelle par un point (normal, lightDir).
Il existe d'autres méthodes intéressantes et la plupart d'entre elles sont mises en œuvre dans l'excellente démo: Matt Pettineo - "Un échantillonnage de techniques d'ombre" .
la source