Я пытался реализовать динамическое затенение в моей игре, следуя этому руководству.
Я успешно включил его в свою игру и внес в файл fx модификацию, чтобы вырезатьдлина тени и оставьте немного света позади тени (белый парусный корабль и персонаж показывают эту модификацию).
![enter image description here](https://i.stack.imgur.com/Vt2eQ.png)
Однако я столкнулся с проблемой, когда тень красного парусного корабля полностью исчезла, когда он находился на пути тени белого корабля.Это должно выглядеть примерно так, как на следующей фотографии.
![enter image description here](https://i.stack.imgur.com/9i5Qo.png)
код, ответственный за преднамеренную резку тени и непреднамеренное исчезновение всего, что за ней (я думаю), выглядит следующим образом.
int cutShadow : CUTSHADOW;
int shadowPadding : PADSHADOW;
float4 DrawShadowsPS(float2 TexCoord : TEXCOORD0) : COLOR0
{
// distance of this pixel from the center
float distance = length(TexCoord - 0.5f);
distance *= renderTargetSize.x;
//apply a 2-pixel bias
distance -=2;
//distance stored in the shadow map
float shadowMapDistance;
//coords in [-1,1]
float nY = 2.0f*( TexCoord.y - 0.5f);
float nX = 2.0f*( TexCoord.x - 0.5f);
//we use these to determine which quadrant we are in
if(abs(nY)<abs(nX))
{
shadowMapDistance = GetShadowDistanceH(TexCoord,0);
}
else
{
shadowMapDistance = GetShadowDistanceV(TexCoord,0);
}
//if distance to this pixel is lower than distance from shadowMap,
//then we are in light
float light = distance < shadowMapDistance ? 1:(0.5f); // shadow transparency
// custom code to reduce the length of the shadow
if((distance > shadowMapDistance && distance < shadowMapDistance + shadowPadding) || distance > shadowMapDistance + cutShadow)
{
light = 1;
}
float4 result = light;
result.b = length(TexCoord - 0.5f);
result.a = 1;
return result;
}
Полный код для этой техники доступен здесь
Для всех, кто еще со мной, может быть ясно, что я довольно новичок в HLSL.Я взял перерыв в этой проблеме, чтобы попытаться узнать больше о HLSL.После возвращения к проблеме у меня все еще есть проблемы, пытающиеся исправить эту ошибку.
В конце концов я попытался решить проблему по-другому, у каждого объекта отбрасывания тени на этом рисунке был свой собственный экран теней (именно так я получил изображение для неблокированной тени) вместо того, чтобы иметь одинтеневой экран для всех кастеров.Тень каждого объекта приведения, которая является размером области просмотра, затем отображается на устройстве.Решение, честно говоря, просто мусор - намного дороже и заставляет "свет" быть наслоенным, а порядок яркости на столько теней будет отбрасываться в окне просмотра.
Мне интересно, есть ли способ решить эту проблему, изменив приведенный выше код пиксельного шейдера.Кто-нибудь может мне помочь?