유니티 공식 홈페이지에 게재된 'Unity 5.0 Uprade Guide'의 일부를 번역한 내용입니다.

 (해당 블로그 글은 향후 업데이트될 수 있습니다.)



Shaders



Shaders no longer apply a 2x multiply of light intensity

 이제 셰이더에서 더이상 조명 강도(light intensity)의 2x곱을 적용하지 않습니다. 대신 조명은 두 배 밝기로 자동적으로 업그레이드됩니다. 이것을 통해서 조명을 다루는데 더욱 일관성과 단순함을 가져올 수 있습니다. 예를 들어 하얀 산란 표면(diffuse surface) 위에서 빛나는 방향광(directional light)은 그 조명의 정확한 색상을 얻을 것입니다. 이러한 업그레이드는 애니메이션에는 영향을 주지 않습니다. 따라서 만약 사용자가 조명 강도값을 애니메이션하는 구현한 부분이 있다면 애니메이션 커브와 스크립트 코드를 수정해야 합니다. 동일한 겉보기를 유지하려면 해당값을 두 배로 만들어야 합니다.


 사용자가 자신의 조명 함수를 정의한 커스텀 셰이더의 경우, 직접 *2 부분을 제거해야 합니다. 서피스 셰이더는 이 이슈에 대한 처리를 할 필요없습니다.  


// 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);


Increased interpolator and instruction counts for some surface shaders

 Unity 5의 빌트-인 조명 파이프라인은 몇몇 경우에서 더 많은 개수의 texture coordinate interpolator 와 math instruction을 사용할 수 있습니다 (논-유니폼 메쉬 스케일, 동적 GI 등의 작업). 


기존 서피스 셰이더 중의 일부는 해당 셰이더들이 shader model 2.0 (디폴트)를 타겟팅하는 경우라면, texture coordinate 또는 ALU instruction 제한에 걸리는 상황을 낳을 수 있습니다. 이럴 때는 “#pragma target 3.0”을 추가하여 이 이슈를 해결할 수 있습니다. 

http://docs.unity3d.com/Manual/SL-ShaderPrograms.html 을 참조하세요.



Non-uniform mesh scale has to be taken into account in shaders

 Unity 5에서는 논-유니폼 메쉬는 더 이상 CPU에서 “프리스케일(prescaled)” 되지 않습니다. 따라서 버텍스 셰이더에서 노멀과 탄젠트 벡터는 정규화(normalize)되지 않은 상태일 수 있습니다. 만약에 직접 제작한 조명 연산을 하고 있다면, 이 벡터들을 정규화해줘야 합니다. 만약 유니티 서피스 셰이더를 사용하고 있다면, 모든 필요한 코드는 알아서 생성되므로 신경쓸 필요 없습니다. 



Fog handling was changed

Unity 5는 빌트-인 포그(Fog)가 WP8 과 콘솔에서 동작하게 해줍니다. 그러나 이것을 가능하게 하기 위해서는 포그(fog) 동작 방식을 약간 수정해야 했습니다. 서피스 셰이더와 고정함수(fixed function) 셰이더에서 특별히 해 줘야 할 일은 없습니다. - 포그는 자동으로 추가됩니다.(포그 지원을 받지 않으려면 서피스 셰이더 #pragma 라인에 "nofog"라고 추가하세요.) 


이제 직접 작성된 버텍스/프래그먼트 셰이더에서는 포그가 자동 적용되지 않습니다. 셰이더 코드에서 #pragma multi_compile_fog 와 포그 관련 매크로(macro)들이 추가해야 합니다. 어떤 방식으로 적용하는지를 보려면, Unlit-Normal과 같은 빌트-인 셰이더의 소스를 확인해 보세요.  



Surface shaders alpha channel change

 이제 기본적으로 모든 불투명(opaque) 서피스 셰이더는 알파 채널값으로 1.0(“white”)을 출력할 것입니다. 이것을 원치 않는다면, #pragma surface 라인에서 “keepalpha” 옵션을 사용하세요. 


 모든 알파블렌드 서피스 셰이더는 블렌드 팩터로 조명 함수에 의해 연산된 알파 요소를 사용합니다(s.Alpha 대신에). 만약 커스텀 조명 함수를 사용하고 있다면, 아마도 함수의 끝 부분에 “c.a = s.Alpha”와 같은 코드를 추가하길 원할 수 있습니다.



Sorting by material index has been removed

 포워드(forward) 렌더루프에서 더 이상 머티리얼 인덱스로 정렬하지 않습니다. 더 많은 오브젝트들이 서로 간의 상태(state) 변경 없이 렌더링될 수 있게 되면서 성능이 향상됩니다. 이렇게 되면 정렬방법으로써 머티리얼 인덱스에 의존했던 컨텐츠를 위한 호환성이 깰 것입니다. 4.x 버전에서 두 개의 머티리얼을 가진 메쉬는 항상 첫번째 머티리얼이 먼저 렌더링되었습니다. 유니티 5에서의 그 렌더 순서는 씬 렌더링을 위해  상태 변경을 가장 줄이는 방향에 의존적입니다.

  


Fixed function TexGen, texture matrices and some SetTexture combiner modes were removed

 유니티 5에서는 고정 함수(fixed function) 셰이더에서 지원되던 기능의 일부를 제거했습니다.

  - UV 좌표 생성 (TexGen 커맨드)

  - UV 변환 행렬 (텍스처 프로퍼티 또는 SetTexture에서 사용되던 Matrix 커맨드)

  - 잘 사용되지 않는 SetTexture combiner mode를 없앰. (a+-b), (a*b+-c), (a*b-c), (dot3, dot3rgba)


 위에 나열된 내용은 이제 어떤 것도 동작하지 않을 것이며, 사용할 경우에는 셰이더 인스펙터를 통해 경고를 보여줄 것입니다. 이 영향을 받아 문제가 되는 셰이더는 프로그래머블 버텍스+셰이더를 사용하여 재작성 하세요. 지금은 모든 플랫폼에서 이것을 지원하므로, 따라서 고정 함수 셰이더를 사용하는 것에 대한 어떠한 장점도 없습니다.  


 만약 아주 오래된 버전의 Projector 또는 Water 셰이더 패키지를 사용하고 있다면, 셰이더들이 제거된 기능을 사용하고 있을 수 있습니다. 그러므로 패키지를 5.0 버전으로 업그레이드하세요.



Mixing programmable & fixed function shader parts is not allowed anymore

 프로그래머블 셰이더와 고정 함수(fixed function) 셰이더 혼용이 더 이상 불가합니다(예를 들면, 고정함수 버텍스 라이팅&픽셀 셰이더 조합 또는 버텍스 셰이더&텍스처 컴바이너 조합). 어쨋든 DirectX, 콘솔, 모바일에서는 원래 동작하지 않았던 부분입니다.

이런 문제를 해결하기 위해서 Legacy/Reflective/VertexLit 셰이더를 수정할 필요가 있었습니다 (per-vertex specular 지원이 사라졌지만,이제는 플랫폼 간에 일관성있게 해당 셰이더가 동작함).



D3D9 shader compiler was switched from Cg2.2 to HLSL

 이로 인해서 코드자동 생성에 대한 버그가 줄어들고 셰이더가 좀더 빠르게 동작하도록 합니다. 하지만 HLSL 컴파일러의 경우 문법적으로 약간 까다로울 수 있습니다.


 - output 변수를 완전히 초기화시켜야 합니다. UNITY_INITIALIZE_OUTPUT 매크로를 사용하도록 하세요.

 - "float3(4요소값)" 같은 생성자 형식은 더 이상 쓸 수 없습니다. "float2(4요소값.xyz)"와 같은 형식으로 생성자를 사용해야 합니다.



“unity_Scale” shader variable has been removed

 “unity_Scale" 셰이더 속성이 제거되었습니다. 4.x 버전에서 unity_Scale.w는 transform 의 1/유니폼 스케일이었고, 단지 논-스케일 또는 유니폼 스케일 모델만을 렌더링하기 위해 쓰였습니다. 그 외의 다른 스케일은 CPU에서 수행되었는데, 이것에 대한 매우 비용이 컸고 기대하지 않은 메모리 오버헤드를 발생시켰습니다.

 유니티 5에서는 단순히 논-유니폼 스케일을 포함한 행렬을 셰이더로 넘김으로써 이 모든 것들이 GPU에서 수행됩니다. 따라서 unity_Scale 값은 전체 스케일에 대한 것을 표현할 수 없기 때문에 제거되었습니다. 예전에 unity_Scale이 사용되었던 대부분의 상황에 대해서 먼저 월드 스페이스로의 변환을 추천합니다. 노멀(normal)의 경우 앞으로는 변환되어 넘어온 노멀에 대해서 항상 정규화(normalize)해야 합니다. 어떤 경우에는 이것 때문에 버텍스 셰이더 상에서 약간 더 비용이 드는 코드를 작성하게 합니다.  


// 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;



Shadows, Depth Textures and ShadowCollector passes

 포워드 렌더링된 방향광(directional light) 그림자는 더 이상 “shadow collector” 패스로 분리되지 않습니다. 이제 카메라의 깊이 텍스처로부터 스크린 스페이스 그림자를 계산합니다(디퍼트 라이팅에서와 같이).


 이것은 셰이더에서의 LightMode=ShadowCollector 패스가 어떤 것에도 사용되지 않음을 의미합니다. 그냥 셰이더에서 이것들을 제거해주세요. 


 그 자신의 깊이 텍스처는 더 이상 셰이더 리플레이스먼트(shader replacement)를 사용하여 생성되지 않습니다; 그것은 ShadowCaster 셰이더 패스에서 렌더링되어 만들어 집니다. 이것은 오브젝트들이 적절한 그림자를 캐스팅할 수 있는 한 카메라의 깊이 텍스처 안에서도 잘 나타날 것입니다 (예전에 만약 커스텀 버텍스 애니메이션 또는 funky한 알파 테스팅을 했다면 이렇게 하는 것은 어려웠었습니다). 이는 또한 Camera-DepthTexture.shader가 이제는 사용되지 않음을 의미합니다. 그리고 또한 모든 빌트-인 셰도우 셰이더는 후면(backface) 컬링을 사용하지 않습니다; 이것은 일반(regular) 렌더링에서의 컬링모드와 일치하게 하려고 수정했습니다.


 글 내용과 관련하여 문의사항이 있으시면 댓글을 남겨주세요, 

 감사합니다.



2015/03/11 - [Unity/Unity 5] - 유니티5 업그레이드 가이드5 - Physics


2015/03/10 - [Unity/Unity 5] - 유니티5 업그레이드 가이드4 - Plugins & Baked Data format changes


2015/03/06 - [Unity/Unity 5] - 유니티5 업그레이드 가이드3 - Audio


2015/03/06 - [Unity/Unity 5] - 유니티5 업그레이드 가이드2 - Animation


2015/03/06 - [Unity/Unity 5] - 유니티5 업그레이드 가이드1 - AI




Posted by 흑 기사
,