Version: 2017.3
Unity 5.6으로 업그레이드
Unity 5.4로 업그레이드

Unity 5.5로 업그레이드

셰이더: 물리 기반 셰이딩 코드 변경 사항

물리 기반 셰이딩 관련 코드가 Unity 5.5에서 리팩토링되었습니다(UnityStandardBRDF.cginc 파일 등). 대부분의 경우 일부 함수를 수동으로 직접 호출하지 않는 한 셰이더 코드에는 직접적인 영향이 없습니다. 중요한 변경 사항은 아래에 나열되어 있습니다.

  • 이제는 평활도, 러프니스 및 지각 러프니스 간에 전환하기 위한 다음과 같은 함수가 있습니다. PerceptualRoughnessToRoughness, RoughnessToPerceptualRoughness, SmoothnessToRoughness, RoughnessToSmoothness.

  • UnityStandardBRDF.cginc의 가시성 조건은 roughness를 사용하고 perceptualRoughness를 사용하지 않습니다.

  • Unity의 구 버전에서는 Marmoset 러프니스를 사용하여 다시 매핑할 수 있었습니다. GGX로 이동하면 더 이상 일치하지 않고, UNITY_GLOSS_MATCHES_MARMOSET_TOOLBAG2 정의와 관련 코드가 제거되었습니다.

  • Gbuffer 읽기 및 쓰기는 모두 새 함수인 UnityStandardDataToGbuffer/UnityStandardDataFromGbuffer를 거쳐야 합니다.

  • 셰이더 코드에서는 UnityGlossyEnvironmentSetup()을 호출하여 Unity_GlossyEnvironmentData 구조체를 초기화해야 하고, 수동으로 수행할 수 없습니다.

  • Unity_GlossyEnvironmentDataroughness 변수는 실제로 “지각 러프니스”지만, 기존 셰이더 코드에서 오류가 발생하지 않도록 하기 위해 이름을 변경하지 않았습니다. 참고: UnityGlossyEnvironmentSetupsmoothness를 파라미터로 사용하고 지각 러프니스를 계산합니다.

  • UnityLightndotl 변수 값은 이제 전송 중에 계산되고, 변수에 작성되는 값은 무시됩니다.

  • UNITY_GI 매크로는 사용이 중단되었으며, 더 이상 사용하지 않아야 합니다.

셰이더: DirectX 9 하프 픽셀 오프셋 문제

Unity 5.5는 이제 DX9 하프 픽셀 오프셋 래스터화를 백그라운드에서 처리하므로 셰이더나 코드의 DX9 하프 픽셀 문제를 더 이상 수정하지 않아도 됩니다. 세부 정보는 이 블로그 포스트을 참조하십시오. 다음 체크 중 하나 이상을 코드에서 사용하는 경우 이제 제거해도 됩니다.

  • 셰이더에서 UNITY_HALF_TEXEL_OFFSET을 확인하고 이를 기반으로 버텍스/UV를 이동합니다.
  • SystemInfo.graphicsDeviceType 또는 SystemInfo.graphicsDeviceVersion을 통해 D3D9를 확인하고 이를 기반으로 버텍스/UV를 이동합니다.

Unity는 이제 하프 픽셀 조정 코드를 컴파일되는 모든 버텍스 셰이더에 삽입하여 이 문제를 해결합니다. 그 결과 버텍스 셰이더 상시 레지스터 c255가 Unity에 의해 예약됨과 더불어 모든 셰이더에 명령이 2개 추가되고 임시 레지스터가 하나 더 사용됩니다. 버텍스 셰이더가 사용 가능한 리소스(상시/임시 레지스터 및 명령 슬롯)를 모두 최대한으로 사용하지 않는 한, 이로 인한 문제는 발생하지 않습니다.

셰이더: Z 버퍼 플로트 반전

Z 버퍼(뎁스 버퍼) 방향이 반전되어 이제는 Z 버퍼에 근거리 평면에서 1.0이 포함되고 원거리 평면에서 0.0이 포함됩니다. 이 변경 사항과 플로팅 포인트 뎁스 버퍼로 인해 뎁스 버퍼 정밀도가 크게 향상되어 특히 작은 근거리 평면과 큰 원거리 평면을 사용하는 경우 Z 파이팅이 감소하고 섀도우가 개선됩니다.

그래픽스 API 변경 사항:

  • 클립 공간 범위는 [0, far]가 아니고 [near, 0]입니다.
  • _CameraDepthTexture 텍스처 범위는 [0,1]이 아니고 [1,0]입니다.
  • Z 바이어스는 적용 전에 거부됩니다.
  • 24비트 뎁스 버퍼가 32비트 플로트 포맷으로 전환됩니다.

다음 매크로/함수는 다른 단계 없이 리버스된 Z 상황을 처리합니다. 셰이더가 이미 사용하고 있을 경우 일부러 변경할 필요는 없습니다.

  • Linear01Depth(float z)
  • LinearEyeDepth(float z)
  • UNITY_CALC_FOG_FACTOR(coord)

하지만 Z 버퍼 값을 수동으로 페치하는 경우 다음과 유사한 코드를 작성해야 합니다.

float z = tex2D(_CameraDepthTexture, uv);
#if defined(UNITY_REVERSED_Z)
    z = 1.0f - z;
#endif

클립 공간 뎁스에는 다음과 같은 매크로를 사용할 수 있습니다. 참고: 이 매크로는 OpenGL/ES 플랫폼에서 클립 공간을 변경하지 않고 [-near, far]로 유지됩니다.

float clipSpaceRange01 = UNITY_Z_0_FAR_FROM_CLIPSPACE(rawClipSpace);

_ZBufferParams에는 이제 리버스된 뎁스 버퍼가 있는 플랫폼에서 다음 값이 포함됩니다. 자세한 내용은 플랫폼별 렌더링 차이 문서를 참조하십시오.

x = -1+far/near
y = 1
z = x/far
w = 1/far

Z 바이어스는 Unity에서 자동으로 처리되지만, 네이티브 코드 렌더링 플러그인을 사용하는 경우 일치하는 플랫폼의 C/C++ 코드에서 부정해야 합니다.

특수 폴더: “Resources”라는 Unity 에디터 하위 폴더

“Editor” 라는 폴더의 모든 하위 폴더는 빌드에서 제외되고 플레이 모드에서 Unity 에디터에 로드되지 않습니다. 이전에는 “Resources” 라는 하위 폴더의 에셋이 빌드에 포함되었습니다. 이 에셋은 에디터 스크립트에서 Resources.Load()를 호출하여 계속 로드할 수 있습니다.

예를 들어 다음 파일은 빌드에서 제외되고 플레이 모드에서 에디터에 로드되지 않지만 스크립트에서 호출하면 로드됩니다.

  • Editor/Foo/Resources/Bar.png (에디터 코드에서 “Bar.png”로 로드됨)
  • Editor/Resources/Foo.png
  • Editor/Resources/Editor/Resources/Foo.png (에디터 코드에서 “Foo.png”로 로드되고 “Editor/Resources/Foo.png”로 로드되지 않음)

다음 에셋은 모든 상황에 로드됩니다.

  • Resources/Editor/Foo.png
  • Resources/Foo/Editor/Bar.png (“Foo/Editor/Bar.png”로 로드됨)
  • Resources/Editor/Resources/Foo.png (“Foo.png”로 로드되고 “Editor/Resources/Foo.png”로 로드되지 않음)

Backface Tolerance 및 Final Gather

이전에 Lightmap Parameters의 ‘Backface Tolerance’ 파라미터는 파이널 개더를 베이크된 GI에 사용할 경우 적용되지 않았지만, 이제는 올바르게 적용됩니다. 파라미터는 이제 실시간 GI와 베이크된 GI 단계에 모두 영향을 미칩니다(파이널 개더 포함).

주로 단면 지오메트리(대형 광고판 등)가 있는 씬에 영향이 있습니다. 이런 씬에서는 단면 지오메트리의 후면을 보는 텍셀의 무효화를 방지하기 위해 ‘Backface Tolerance’를 조정할 수 있어야 합니다. 이제는 대형 광고판 및 파이널 개더를 사용하는 씬의 라이트맵을 ‘Backface Tolerance’를 조정하여 개선할 수 있지만, 디폴트가 아닌 ‘Backface Tolerance’를 적용할 경우 이제는 파이널 개더 단계에 올바르게 고려되기 때문에 다른 씬에도 영향을 미칠 수 있습니다.

스탠다드 셰이더 BRDF2에서 이제 GGX 근사 사용

모바일 플랫폼에 기본적으로 설치되는 스탠다드 셰이더인 BRDF2에서는 이제 GGX 근사를 Blinn-Phong 대신 사용합니다. 따라서 (데스크톱에서 기본적으로 사용되는) BRDF1과 더 비슷해 보이고 화질이 개선됩니다.

레거시 근사를 유지해야 하는 경우 #if UNITY_BRDF_GGX 문 안에 새로운 구현이 있는 UnityStandardBRDF.cginc에서 BRDF2 코드를 변경해야 합니다( BRDF1에서 GGX를 선택하는 데도 사용됨). UnityStandardConfig.cginc에서 정의를 변경하거나 #if UNITY_BRDF_GGX를 #if 0 in the BRDF2_Unity_PBS 함수로 변경해야 합니다.

Android용 Gradle

이제 Gradle을 사용하여 Android를 타겟으로 빌드할 수 있습니다.

Gradle은 기존 Unity Android 빌드 시스템보다 오류에 대해 엄격하지 않으므로 일부 기존 프로젝트를 Gradle로 전환하기 힘들 수 있습니다. 이 빌드 실패를 확인하고 해결하는 방법은 Gradle 문제 해결 문서를 참조하십시오.

오브젝트 오버로드 인스턴스화가 변경됨

기본적으로 오리지널 게임 오브젝트의 파라미터와 부모 Transform의 파라미터를 하나씩 사용하는 Instantiate 함수의 특정 오버로드가 다르게 작동하도록 변경되었습니다. 오리지널 게임 오브젝트의 포지션과 회전이 더 이상 월드 공간 포지션 및 회전으로 해석되지 않으므로 지정된 부모 Transform의 포지션 및 회전이 무시됩니다.

이제는 포지션 및 회전이 기본적으로 지정된 부모 Transform 공간 내 로컬 포지션 및 회전으로 해석되어 에디터의 동작과 일치합니다. 스크립트는 자동으로 업데이트되지 않습니다. 따라서 이 변경 사항을 반영하여 업데이트되지 않은 이 Instantiate의 과부하에 대한 호출이 포함된 스크립트를 실행하면 예기치 못한 동작이 발생할 수 있습니다.

렌더러 및 LOD Group 컴포넌트 동작

LOD Group 컴포넌트를 비활성화해도 연결된 렌더러가 더 이상 비활성화되지 않습니다. LOD Group 설정은 LOD Group 컴포넌트가 활성화된 경우에만 렌더러에 적용됩니다. 프로젝트를 업그레이드하면 Unity가 이 변경 사항을 자동으로 적용하므로 변경 사항을 되돌릴 수 없습니다.

Unity 5.6으로 업그레이드
Unity 5.4로 업그레이드