LightStreak

  • aka. CrossFilter
  • Streak 자국, 흔적

crossFilter.JPG

- 원본
- 축소
  - 밝은부분
    - 블러
    - 카메라 기준 6방향 늘이기
    - 늘린것 합치기
- 원본과 합쳐진 늘려진것 더하기
용도사이즈Format기타
원본w, h
축소w/4, h/4R16G16B16A16
휘도w/4 +2, h/4 +2R8G8B8A8
블러w/4 +2, h/4 +2R8G8B8A8
늘리기w/4, h/4품질(R16G16B16A16) // 속도(R8G8B8A8)6장은 방향늘리기, 2장은 임시버퍼
                source,             _TmpCopy : 복사
               _TmpCopy,          _ScaledTex : 축소
            _ScaledTex,           _BrightTex : 밝기 추출
            _BrightTex, _BaseStarBlurredTex1 : 블러
  _BaseStarBlurredTex1, _BaseStarBlurredTex2 : 블러

  _BaseStarBlurredTex2,            _StarTex0 : 늘리기
             _StarTex0,            _StarTex1 : 늘리기2
             _StarTex1,            _StarTex2 : 광선 임시저장
             ...
           _StarTex2~7,            _StarTex0 : 최종적으로 광선별 합치기
  _TmpCopy + _StarTex0,               source : 원본 텍스쳐에 적용
cropW = srcW - srcW / Scale
cropH = srcH - srcH / Scale
scaledW = cropW / Scale
scaledH = cropH / Scale
brightW = scaledW + 2;
brightH = scaledH + 2;
  • Scale을 4로 축소시키면서 축소버퍼의 복사로 픽셀과 텍셀이 1:1 대응함으로 무리없이 복사가능.
  • 휘도버퍼에서 패딩은(+2)
public static int ToPow2RoundUp(int x)
{
  if(x == 0)
  {
    return 0;
  }
  return MakeMSB(x - 1) + 1;
}

public static int MakeMSB(int x)
{
  // 0b_0000_0000_0000_0000_1000_0000_1000_1011
  // MakeMSB(0b_1000) => 0b_1111 //  8 => 15
  // MakeMSB(0b_1111) => 0b_1111 // 15 => 15

  x |= x >> 1;
  x |= x >> 2;
  x |= x >> 4;
  x |= x >> 8;
  x |= x >> 16;
  return x;
}
int topBloomWidth = width >> Properties.DownSampleLevel;
int topBloomHeight = height >> Properties.DownSampleLevel;

w = TextureUtil.ToPow2RoundUp( topBloomWidth), 
h = TextureUtil.ToPow2RoundUp( topBloomHeight), 

brightnessOffsetX = (w - topBloomWidth) / 2;
brightnessOffsetY = (h - topBloomHeight) / 2;

Ref