TeamSOC / SOCEngine

MIT License
4 stars 0 forks source link

PCF Shadow 수정 / 정리 #62

Closed Jin02 closed 6 years ago

Jin02 commented 6 years ago

From @Jin02 on December 2, 2016 13:39

36 의 코맨트들을 가져왔다.

작성해둔 것들이 거의 PCF에서 뜯어고쳐야 할 것들이기때문에 새로운 이슈로 등록했다.


https://github.com/Jin02/SOCEngine/blob/master/SOCEngine/SOCEngine/ShaderCodes/Shadow.h#L86-L95

위의 링크같은 코드 형식이 아니라 코드가 중복되더라도 좀 깔끔해 보이도록 짜야할 것 같다.

완료


https://github.com/Jin02/SOCEngine/blob/master/SOCEngine/SOCEngine/ShaderCodes/Shadow.h#L16-L29

float softness      = f16tof32(????????);

uint lightCapacityCount = GetNumOf_____Light(shadowGlobalParam_packedNumOfShadowAtlasCapacity);
float oneShadowMapSize  = float(1 << GetNumOf_____Light(shadowGlobalParam_packedPowerOfTwoShadowResolution));
float2 atlasMapSize = float2(isPointLight ? 6.0f : 1.0f, lightCapacityCount) * oneShadowMapSize;
float2 stepUV       = rcp(atlasMapSize) * (1.0f + softness);

float PCF_Filtering(Texture2D<float> atlas, float2 uv, float depth, float2 stepUV)
{
    float shadow = 0.0f;
    [unroll] for(int i=-SHADOW_KERNEL_LEVEL; i<=SHADOW_KERNEL_LEVEL; ++i)
    {
        [unroll] for(int j=-SHADOW_KERNEL_LEVEL; j<=SHADOW_KERNEL_LEVEL; ++j)
        {
            float2 offset = float2(i, j) * stepUV;
            shadow += atlas.SampleCmpLevelZero(shadowLinearSamplerCmpState, uv + offset, depth).x;
        }
    }

    shadow /= (float)(SHADOW_KERNEL_WIDTH * SHADOW_KERNEL_WIDTH);
    return shadow;
}

대충.. 이런식으로 바꿔두자


PCSS / PCF를 새로 구성하면서 추가해야할 Param은..

  1. LightNear
  2. LightFar
  3. UnderScanSize
  4. Softness

전부 half 타입으로 설정하면 된다. PointLight의 경우 UnderScanSize가 다른곳에 선언이 되어있는데, 그것도 고쳐줘야 한다. https://github.com/Jin02/SOCEngine/blob/master/SOCEngine/SOCEngine/ShaderCodes/TBDRInput.h#L49

겸사겸사.. https://github.com/Jin02/SOCEngine/blob/master/SOCEngine/SOCEngine/ShaderCodes/TBDRInput.h#L49-L51

여기 있는 것들을 고치면 될 듯 싶다. 그럼.. 일단 필요한걸 정리해보자면,

  1. Light Near - 16bit
  2. Light Far - 16bit
  3. UnderScanSize - 16bit
  4. Softness - 8 or 16bit
  5. Light Index - 16bit
  6. Bias - 8 or 16bit
  7. Flag - 4 or 8bit
  8. color - 32bit

1 ~ 4까지 half4로 짜르고 5 ~ 8까지 uint2로 짜르면 된다. 8은 개별 하나로 두고, 5 6 7은 패킹하면 된다.

그래서.. 전체 16 바이트로 구성이 된다. ( 8byte(half4) + 8byte(uint2) ) f16tof32 성능이 얼마나 좋을지는 모르겠지만.. 위에 8개를 한번에 묶어서 16byte로 가면 될 듯 싶다.


참고,

https://github.com/Jin02/SOCEngine/blob/master/SOCEngine/SOCEngine/Rendering/Shading/BindIndexInfo.h#L58-L60

얘네 안쓰임. 그런데 내부에서는 계속 계산을 돌리고 있다.

https://github.com/Jin02/SOCEngine/blob/c55108de80b5057b0ad01824a134ffb170f04dae/SOCEngine/SOCEngine/ShaderCodes/InjectRadianceFromPointLight.hlsl#L26 예전에 VCT Injection 처리한다고 만들었던 것들인데 앞으로 쓰진.. 않을 것 같다.

여튼 이 작업 진행하면서 불필요한 행렬 계산 및 코드들을 제거해줘야 한다.

Copied from original issue: Jin02/SOCEngine#62