Physics in Unity 5.0
Other Upgrade Notes for Unity 5.0

Shaders in Unity 5.0

사용자 정의 쉐이더 코드를 포함하고 있는 경우, Unity 4에서 Unity 5로 업그레이드 할 때 주의해야 하는 점이 있습니다.

쉐이더는 빛의 강도에 2x의 곱셈을 하지 않습니다

쉐이더는 빛의 강도에 2x의 곱셈을 하지 않습니다. 대신 라이트는 자동으로 2배 밝아지도록 업그레이드되어 있습니다. 이 작성 방법은 라이트의 조작에 대해 일관성과 심플함을 제공합니다. 예를 들어, 백색의 확산면의 디렉셔널 라이트의 빛은 라이트의 색상을 정확하게 가져옵니다. 이 업그레이드는 빛은 라이트의 강도 값을 애니메이션시키고 있는 것에는 영향을 주지 않으므로 애니메이션 커브, 스크립트 코드를 약 2배 수동으로 변경해야 합니다.

In the case of custom shaders where you define your own lighting functions, you need to remove the * 2 yourself.

// A common pattern in shader code that has this problem will look like this
c.rgb = s.Albedo * _LightColor0.rgb * (diff * atten * 2);
// You need to fix the code so it looks more like this
c.rgb = s.Albedo * _LightColor0.rgb * (diff * atten);

표면 쉐이더 인터폴레이터와 명령 수의 증가

Unity 5 내장 라이팅 파이프 라인은 더 많은 텍스처 좌표 인터폴레이터 또는 (비 균일 메쉬 스케일, GI 등을 동작시키기 위한) 수학 명령 수를 사용합니다. 현존하는 표면 쉐이더의 일부는, 특히 (기본) 쉐이더 모델 2.0을 대상으로 하는 경우, 텍스처 좌표 또는 ALU 명령어 제한 문제와 충돌할 지도 모릅니다. 이 문제에 대해서는 “#pragma target 3.0”으로 더해 씀으로써 작동할 수 있습니다. 레퍼런스의 http://docs.unity3d.com/Manual/SL-ShaderPrograms.html을 참고하십시오.

쉐이더에서는 비 균일 메쉬 스케일을 고려해야 합니다

Unity 5.0의 비 균일 메쉬는 CPU에서 ’미리 스케일되지 않습니다". 이것은 법선 벡터와 수직 벡터가 정점 쉐이더에서 단위화(normalized)되지 않을 수 있다는 의미입니다. 그래서 수동 라이팅 계산을 하고 있다면 그들을 단위화해야 할지도 모릅니다. Unity의 서피스(Surface) 쉐이더를 사용하는 경우, 필요한 모든 코드가 생성됩니다.

안개 조작 변경

Unity 5.0에서는 내장 안개가 WP8과 콘솔에서 작동하지만, 그렇게 하도록 하기 위해 안개가 실행되는 것을 조금 변경했습니다. 표면 쉐이더와 고정 함수 쉐이더에서 실행하기 위해 특별히 필요한 것은 없습니다 - 안개가 자동으로 추가됩니다 (안개를 명확하게 지원하지 않기 때문에 표면 쉐이더의 #pragma 라인에 “nofog”라고 추가할 수 있습니다).

수동으로 버텍스(vertex) / 프래그먼트(Fragment) 쉐이더를 작성하는 안개는 자동으로 일어나지 않습니다. #pragma multi_compile_fog 안개 조작 매크로를 쉐이더 코드에 추가해야 합니다. 예를 들어, Unlit-Normal은 어떻게 실행되고 있는지 내장 쉐이더의 소스를 확인하십시오.

서피스 쉐이더의 알파 채널 변경

기본적으로 모든 불투명한 서피스 쉐이더는 알파 채널에 1.0( “흰색”)을 출력하도록 되었습니다. 이를 방지하려면 “keepalpha” 옵션을 #pragma surface 라인에서 사용하십시오.

모든 알파 블렌딩 된 서피스 쉐이더는 (s.Alpha 대신) 블렌드 팩터로써 라이팅 함수에 의해 계산된 알파 성분을 사용합니다. 사용자 정의 라이팅 함수를 사용하는 경우, 아마도 “ca = s.Alpha” 등을 그 마지막 부근에 추가하고 싶을 것입니다.

머티리얼(material) 인덱스에 의한 정렬 삭제

Unity는 Forward 렌더링 루프에서 머티리얼 인덱스에 의한 정렬을 하지 않게 되었습니다. 그 상태 변경 없이 더 많은 오브젝트를 그릴 수 있도록 성능이 향상되었습니다. 따라서 정렬 방법으로 머티리얼 인덱스에 의존하는 콘텐츠의 호환성이 없어졌습니다. Unity 4.x에서는 메테리얼이 2개 있는 메쉬는 항상 첫 번째 머티리얼이 제일 처음으로, 두 번째 머티리얼이 두 번째로 그려졌습니다. Unity 5는 그런 제한 없이, 씬 그리기를 위한 상태 변화가 가장 적은 것에 의해 순서가 정해집니다.

고정 함수 TexGen, 텍스처 매트릭스 및 SetTexture 결합 장치 모드를 일부 삭제

Unity 5.0은 다음 고정 함수 쉐이더 기능의 지원을 제거했습니다.

  • UV 좌표 생성 (TexGen 명령)
  • (텍스처 프로퍼티의 Matrix 명령, 또는 SetTexture 안의) UV 변형 매트릭스
  • 거의 사용되지 않는 SetTexture 결합 장치 모드 : 부호 가산(a+-b), 곱셈 부호 가산(ab+-c), 곱하기 빼기(abc), 내적(dot product)(dot3, dot3rgba)

상기의 모든 것은 현재는 작동하지 않으므로 쉐이더의 인스펙터는 그 사용 방법에 대해 경고를 표시합니다. 프로그래머블 정점/프래그먼트 쉐이더를 대신 사용하여 영향을 받는 쉐이더를 다시 작성해야 합니다. 최근에는 모든 플랫폼이 그러한 지원을 하고 있으며, 어떤 경우에도 고정 함수 쉐이더를 사용하는 이점은 조금도 없습니다.

당신의 프로젝트에 Projector나 Water 쉐이더 패키지를 합리적으로 사용하고 싶은 경우, 그 쉐이더에서 이 기능을 사용하면 좋을지도 모릅니다. 패키지를 5.0 버전으로 업그레이드하십시오.

프로그램 가능한 쉐이더와 고정 함수 쉐이더 부분의 병용은 불가능

부분적인 고정 함수 쉐이더와 프로그래머블 쉐이더(예를 들어, 고정 함수 정점 라이팅과 픽셀 쉐이더 또는 정점 쉐이더와 텍스처 결합 장치)의 Mixing은 이미 지원되고 있지 않습니다. Mixing은 모바일, 콘솔 또는 DirectX 11 등 어떤 플랫폼에서도 한번도 동작하지 않았습니다. 이 결과를 받아 Legacy / Reflective / VertexLit 쉐이더가 정점 당 스펙큘러 지원을 잃는 일이 없도록 동작을 바꿀 필요가 있었습니다. 한편, 좋은 측면으로는 그들이 플랫폼에서 일정한 동작을 하게 된 것을 들 수 있습니다.

D3D9 쉐이더 컴파일러는 Cg 2.2에서 HLSL로 변경

이 변경은 알기 힘들지도 모릅니다(코드에서 발생하는 버그가 적어져 쉐이더가 약간 빨라진 정도입니다). 그러나 HLSL 컴파일러는 문법에 약간의 어려움이 있을 수 있습니다. 일부 예를 살펴보겠습니다 :

  • 출력 변수는 모두 초기화해야 합니다. D3D11에서 하고 있었던 것처럼 UNITY_INITIALIZE_OUTPUT 헬퍼 매크로를 사용하십시오.
  • “float3(a_4_component_value)” 구조체는 작동하지 않습니다. “a_4_component_value.xyz”를 대신 사용하십시오.

“unity-Scale” 쉐이더 변수 삭제

“unity_Scale” 쉐이더 프로퍼티는 제거되었습니다. 4.x의 unity_Scale.w는 트랜스폼의 1 / uniform Scale이며, Unity 4.x는 비 균일 스케일 또는 균일하게 조정된 모델만 그렸습니다. 다른 스케일은 CPU에서 실행되어 있었지만, 그들은 매우 부하가 높고 메모리 오버 헤드 우려도 있었습니다.

Unity 5.0 쉐이더에 비 균일 스케일이 있는 매트릭스를 심플하게 전달함으로써 이들은 모든 GPU에서 실행됩니다. 그러므로, unity_Scale은 스케일 전부를 표현할 수 없기 때문에 삭제되었습니다. “unity_Scale”가 사용되는 대부분의 경우에서는 우선 월드 공간으로 변환하는 것이 좋습니다. 법선을 변환하려면 항상 변환된 법선에서 정규화를 사용해야 합니다. 정점 쉐이더에서 이 방법을 이용하면 조금이지만 부하 증가의 원인으로 이어질 수 있습니다.

// Unity 4.x
float3 norm = mul ((float3x3)UNITY_MATRIX_IT_MV, v.normal * unity_Scale.w);
// Becomes this in Unity 5.0
float3 norm = normalize(mul ((float3x3)UNITY_MATRIX_IT_MV, v.normal));
// Unity 4.x
temp.xyzw = v.vertex.xzxz * unity_Scale.xzxz * _WaveScale4 + _WaveOffset;
 
// Becomes this in Unity 5.0
float4 wpos = mul (_Object2World, v.vertex);
temp.xyzw = wpos.xzxz * _WaveScale4 + _WaveOffset;

Shadow, Depth Texture 및 ShadowCollector 경로

전면에 그려진 디렉셔널 라이트의 그림자는 “shadow collector”경로로 분리해서 생각할 수 없게 되었습니다. 그들은 카메라 깊이 텍스처를 이용하여 (deferrred 라이팅처럼) 스크린 공간의 그림자를 계산합니다.

이것은 쉐이더 LightMode, 즉 ShadowCollector 경로가 무엇에도 사용되지 않는 것을 의미합니다. 그들을 쉐이더에서 간단히 삭제할 수 있습니다.

깊이 텍스처 자신은 이미 쉐이더 대체를 사용하여 생성되지 않습니다. 대신 ShadowCaster 쉐이더 경로를 따라 그려집니다. 이것은 오브젝트가 적절한 그림자를 캐스팅 할 만큼 길다는 의미로, 카메라의 깊이 텍스처에도 잘 표시되도록 합니다. (이것은 사용자 정의 정점 애니메이션과 펑키한 알파 테스트를 실시하고 싶은 경우, 이전까지는 매우 어려운 일이었습니다). 또한 Camera-DepthTexture.shader가 아무것에도 사용되지 않게 됐다는 뜻이기도 합니다. 또한 모든 내장 그림자 쉐이더는 백 페이스 컬링을 사용하지 않았습니다. 이것은 일반적인 렌더링 컬링 모드로 변경되었습니다.

Physics in Unity 5.0
Other Upgrade Notes for Unity 5.0