레이블이 URP인 게시물을 표시합니다. 모든 게시물 표시
레이블이 URP인 게시물을 표시합니다. 모든 게시물 표시

2022년 5월 15일 일요일

URP)CameraStackManager

CameraStackManager

 
https://github.com/do-won-kim/CameraStack

unity urp로 넘어오면서 카메라가 제법 많이 변경이 있었는데 그중 눈에 띄는 점은 depth가 사라진 점과 depth only 가 사라진 것이다.

depth는 stack이라는 리스트로 depth only는 overlay camera로 구현이 가능한데 사실 기존에 UI canvas쪽을 screen space - overlay를 사용하던 프로젝트는 카메라를 여러대 쓰는게 아니라서 별로 신경쓸 점이 없다.

하지만 불행이도 우리 프로젝트는 screen space - camera를 사용중이였고 그에따라 ui camera가 따로 존재해서 overlay camera 기능을 사용해주어야 했다.

canvas를 전부 overlay로 바꾸는것은 이펙트 때문에 작업량이 많아져서 불가능 했기 때문에 기존 형태에서 자동으로 씬 이동이나 overlay 카메라가 켜지거나 꺼질때 혹은 base 카메라가 추가되거나 꺼지거나 할때 자동으로 stack 이라는 리스트를 관리해줄 필요성이 있어서 해당 매니저를 제작하게 되었다.


-camera stacking 스크립트-

사용법은 간단하다 CsCameraStacking 스크립트를 카메라에 부착해주고 depth값을 넣어주면된다.
밑에 bool 값은 overlay로 시작하는 카메라가 아니라 basecamera로 시작하는 카메라에 달린 스크립트에 체크 해주면 된다.

만들때 오래걸리지는 않았지만 이 카메라 변경점은 urp로 넘어올 때 많이 당황했던 부분 중 하나였다.


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에서는 오히려 파랑색쪽 코드를 사용하니깐 기존 색이 유지되고 이상하게 색이 깨지는 문제도 발생하지 않아서 수정했다.

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