Closed Jin02 closed 6 years ago
From @Jin02 on December 2, 2016 13:39
작성해둔 것들이 거의 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은..
전부 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 ~ 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
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
대충.. 이런식으로 바꿔두자
PCSS / PCF를 새로 구성하면서 추가해야할 Param은..LightNearLightFarUnderScanSizeSoftness전부 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여기 있는 것들을 고치면 될 듯 싶다.그럼.. 일단 필요한걸 정리해보자면,Light Near - 16bitLight Far - 16bitUnderScanSize - 16bitSoftness - 8 or 16bitLight Index - 16bitBias - 8 or 16bitFlag - 4 or 8bitcolor - 32bit1 ~ 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