У меня странное поведение с моими твердыми тенями, которые я никогда раньше не видел из-за мрачного цвета текстур, которые я использовал (эти артефакты не были видны). Вот некоторые скриншоты моей проблемы с 3-мя различными разрешениями shadowmap:Маленькие артефакты с простой теневой технологией отображения теней с использованием OpenGL и GLSL
1) Shadowmap 160 * 120
Как вы можете видеть, есть вид зубов на поверхности куба.
Вот вид сцены из легких позиции:
Вот shadowmap:
2) Shadowmap 640 * 480
С более высоким разрешением артефакты менее заметны, потому что теневая карта повышает точность.
Вот вид сцены из легких позиций:
Вот shadowmap:
Я попытался с более высоким разрешением другим. Конечно, артефакты меньше и меньше, но если вы увеличиваете масштаб поверхности, они все еще видны.
Вот код, который я использую в моем пиксельный шейдер во время второго прохода:
[...]
uniform sampler2DShadow ShadowSampler[MAX_LIGHT_COUNT];
[...]
float GetDynamicShadowBias(vec3 normalDir_cs, vec3 lightDir_cs)
{
float cosTheta = clamp(dot(normalDir_cs, lightDir_cs), 0.0f, 1.0f);
float bias = 0.005f * tan(acos(cosTheta));
return (clamp(bias, 0.0f, 0.01f));
}
float GetBiased_Hard_ShadowFactor(vec3 normalDir, vec3 lightDir, int idx)
{
if (ShadowCoords[idx].w > 0.0f)
{
float bias = GetDynamicShadowBias(normalDir, lightDir);
float LightToOccluderClipDist = texture(
ShadowSampler[idx], ShadowCoords[idx].xyz/ShadowCoords[idx].w);
float LightToVertexClipDist = (ShadowCoords[idx].z - bias)/ShadowCoords[idx].w;
if (LightToOccluderClipDist < LightToVertexClipDist)
return (0.0f);
}
return (1.0f);
}
Так интересно, если это возможно, чтобы удалить эти артефакты по краям куба. Я попытался играть с теневым уклоном без реального успеха (для информации я использую FRONT_FACE отбраковку во время первого прохода (заполнение текстуры глубины)).
Спасибо за эти объяснения.В моем случае я только хотел поговорить об артефактах на кубе, а не в плоскости («зубы» на краях куба). Эти фрагменты не должны быть в тени. Есть ли какой-либо метод (смещения или другие) для удаления этих артефактов по краям куба? – user1364743
Эффективным решением должно быть использование сглаживания. Я уже реализовал такую технику, как техника PCF. Но в моем вопросе я только хотел узнать, можно ли удалить артефакты с жесткими тенями, а не мягкими тенями. Спасибо за вашу помощь! – user1364743
Это та же проблема. Подумайте об этом так: ваша теневая карта имеет конечное разрешение. Возьмите каждый пиксель в теневой карте и проецируйте луч из каждого из четырех углов и центра на сцену. В какой-то момент вы, вероятно, окажетесь с пикселем теневой карты, который проецирует один или два угла на куб, а остальные углы и центрируют на плоскости. Эта часть куба окажется в тени, потому что на карте тени есть только один пиксель, и он считается теневым, потому что центральный луч попадает в плоскость, а не в куб. – user1118321