Затенение заблокировано HLSL XNA - PullRequest
0 голосов
/ 28 июня 2019

Я пытался реализовать динамическое затенение в моей игре, следуя этому руководству.

Я успешно включил его в свою игру и внес в файл fx модификацию, чтобы вырезатьдлина тени и оставьте немного света позади тени (белый парусный корабль и персонаж показывают эту модификацию).

enter image description here

Однако я столкнулся с проблемой, когда тень красного парусного корабля полностью исчезла, когда он находился на пути тени белого корабля.Это должно выглядеть примерно так, как на следующей фотографии.

enter image description here

код, ответственный за преднамеренную резку тени и непреднамеренное исчезновение всего, что за ней (я думаю), выглядит следующим образом.

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.После возвращения к проблеме у меня все еще есть проблемы, пытающиеся исправить эту ошибку.

В конце концов я попытался решить проблему по-другому, у каждого объекта отбрасывания тени на этом рисунке был свой собственный экран теней (именно так я получил изображение для неблокированной тени) вместо того, чтобы иметь одинтеневой экран для всех кастеров.Тень каждого объекта приведения, которая является размером области просмотра, затем отображается на устройстве.Решение, честно говоря, просто мусор - намного дороже и заставляет "свет" быть наслоенным, а порядок яркости на столько теней будет отбрасываться в окне просмотра.

Мне интересно, есть ли способ решить эту проблему, изменив приведенный выше код пиксельного шейдера.Кто-нибудь может мне помочь?

...