2022년 2월 16일 수요일

URP 7.6.3 -> 10.8.1 Specular가 미묘하게 달라져있다.

 URP 7.6.3 -> 10.8.1 Specular가 미묘하게 달라져있다.

Unity 버전을 2019에서 2020으로 올리게 되면서 URP 버전을 강제적으로 올리게 되었는데 몇몇 프랍들이 색이 좀 달라져서 수정하게 되었다.

#1
inline void InitializeBRDFData(half3 albedo, half metallic, half3 specular, half smoothness, inout half alpha, out BRDFData outBRDFData)
{
#ifdef _SPECULAR_SETUP
    half reflectivity = ReflectivitySpecular(specular);
    half oneMinusReflectivity = 1.0 - reflectivity;
    //half3 brdfDiffuse = albedo * (half3(1.0h, 1.0h, 1.0h) - specular);
    half3 brdfDiffuse = albedo * oneMinusReflectivity;
    half3 brdfSpecular = specular;
#else
    half oneMinusReflectivity = OneMinusReflectivityMetallic(metallic);
    half reflectivity = 1.0 - oneMinusReflectivity;
    half3 brdfDiffuse = albedo * oneMinusReflectivity;
    half3 brdfSpecular = lerp(kDieletricSpec.rgb, albedo, metallic);
#endif

    InitializeBRDFDataDirect(brdfDiffuse, brdfSpecular, reflectivity, oneMinusReflectivity, smoothness, alpha, outBRDFData);
}

#2
half3 EnvironmentBRDFSpecular(BRDFData brdfData, half fresnelTerm)
{
    float surfaceReduction = 1.0 / (brdfData.roughness2 + 1.0);
    //float c = surfaceReduction * lerp(brdfData.specular, brdfData.grazingTerm, fresnelTerm);
    float3 c = surfaceReduction * lerp(brdfData.specular, brdfData.grazingTerm, fresnelTerm);

    return c;
}

1번은 그렇다치고 2번은 half3의 specular을 lerp해서 float 값으로 반환해서 색이 이상하게 나오는 문제인데 의도한거 같지는 않고 버그가 아닐까 생각한다.

#3
float DistanceAttenuation(float distanceSqr, half2 distanceAttenuation)
{
    // We use a shared distance attenuation for additional directional and puctual lights
    // for directional lights attenuation will be 1
    float lightAtten = rcp(distanceSqr);

//#if SHADER_HINT_NICE_QUALITY
    // Use the smoothing factor also used in the Unity lightmapper.
    half factor = distanceSqr * distanceAttenuation.x;
    half smoothFactor = saturate(1.0h - factor * factor);
    smoothFactor = smoothFactor * smoothFactor;
//#else
    // We need to smoothly fade attenuation to light range. We start fading linearly at 80% of light range
    // Therefore:
    // fadeDistance = (0.8 * 0.8 * lightRangeSq)
    // smoothFactor = (lightRangeSqr - distanceSqr) / (lightRangeSqr - fadeDistance)
    // We can rewrite that to fit a MAD by doing
    // distanceSqr * (1.0 / (fadeDistanceSqr - lightRangeSqr)) + (-lightRangeSqr / (fadeDistanceSqr - lightRangeSqr)
    // distanceSqr *        distanceAttenuation.y            +             distanceAttenuation.z
    half smoothFactor = saturate(distanceSqr * distanceAttenuation.x + distanceAttenuation.y);
//#endif
    return lightAtten * smoothFactor;
}

3번은 색이 이상하게 나오는 수준이 아니라 아예 깨져서 나왔는데 원래 2019에서 모바일과 에디터 환경에서 색이 다르게 나오는게 문제가 있어서 분기문을 지우고 SHADER_HINT_NICE_QUALITY 쪽 코드를 사용 했는데 2020에서는 오히려 파랑색쪽 코드를 사용하니깐 기존 색이 유지되고 이상하게 색이 깨지는 문제도 발생하지 않아서 수정했다.

일단 정상적으로 플레이 가능하도록 수정하는 작업이 끝나면 원인도 찾아봐야겠다.