2014-10-02 4 views
1

У меня странное поведение с моими твердыми тенями, которые я никогда раньше не видел из-за мрачного цвета текстур, которые я использовал (эти артефакты не были видны). Вот некоторые скриншоты моей проблемы с 3-мя различными разрешениями shadowmap:Маленькие артефакты с простой теневой технологией отображения теней с использованием OpenGL и GLSL

1) Shadowmap 160 * 120

enter image description here

Как вы можете видеть, есть вид зубов на поверхности куба.

Вот вид сцены из легких позиции:

enter image description here

Вот shadowmap:

enter image description here

2) Shadowmap 640 * 480

enter image description here

С более высоким разрешением артефакты менее заметны, потому что теневая карта повышает точность.

Вот вид сцены из легких позиций:

enter image description here

Вот shadowmap:

enter image description here

Я попытался с более высоким разрешением другим. Конечно, артефакты меньше и меньше, но если вы увеличиваете масштаб поверхности, они все еще видны.

Вот код, который я использую в моем пиксельный шейдер во время второго прохода:

[...] 

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 отбраковку во время первого прохода (заполнение текстуры глубины)).

ответ

1

Здесь есть 2 вещи. Во-первых, это ограничение стандартных теневых карт. Поскольку тень любого данного объекта займет некоторое потенциально меньшее количество пикселей на карте, когда вы затем нарисуете эту карту на сцену, эти части могут быть повторно увеличены, и вы получите псевдоним.

Вторая вещь, которая, кажется, происходит, заключается в том, что ваши тени по существу 1 бит, похоже. Они либо черные, либо белые. Если бы вы каким-то образом сгладили карту при ее создании (скажем, суперсэмплинг или какую-то другую технику), это было бы менее заметно (хотя это не исчезло бы полностью в моем опыте).

Есть несколько методов, которые основаны на классических теневых картах. Один из них - Subpixel Shadow Mapping от SIGGRAPH 2013. (Были some other shadow papers that year, too.) Я также видел лучированные тени, реализованные в реальном времени через GLSL. (Извините, не могу найти ссылку! Я отправлю позже, если я могу ее выкопать.)

+0

Спасибо за эти объяснения.В моем случае я только хотел поговорить об артефактах на кубе, а не в плоскости («зубы» на краях куба). Эти фрагменты не должны быть в тени. Есть ли какой-либо метод (смещения или другие) для удаления этих артефактов по краям куба? – user1364743

+0

Эффективным решением должно быть использование сглаживания. Я уже реализовал такую ​​технику, как техника PCF. Но в моем вопросе я только хотел узнать, можно ли удалить артефакты с жесткими тенями, а не мягкими тенями. Спасибо за вашу помощь! – user1364743

+0

Это та же проблема. Подумайте об этом так: ваша теневая карта имеет конечное разрешение. Возьмите каждый пиксель в теневой карте и проецируйте луч из каждого из четырех углов и центра на сцену. В какой-то момент вы, вероятно, окажетесь с пикселем теневой карты, который проецирует один или два угла на куб, а остальные углы и центрируют на плоскости. Эта часть куба окажется в тени, потому что на карте тени есть только один пиксель, и он считается теневым, потому что центральный луч попадает в плоскость, а не в куб. – user1118321

Смежные вопросы