목차
유니티 3.x 그림자 변환 가이드
유니티 3은 그 렌더링 시스템에 많은 새로운 기능과 변화가 있고 ShaderLab도 업데이트 되었습니다. 유니티 2.x에서 쓰였던 어떤 고급 쉐이더는, 특히 픽셀당 빛에 쓰였던 것은 유니티 3에서 업데이트가 필요합니다. 업데이크에 문제가 있다면 저희의 도움을 받으십시오!
유티니3에서의 전반적인 그래픽관련 업그레이드에 대한 자세한 내용은 Rendering Upgrade Details 을 보세요.
로젝트 파일을 유니티 3.x에서 열면 그림자 파일이 가능한 최대로 업그레이드 됩니다. 아래 문서에서는 그런 모든 쉐이더에 생기는 변화와 수동 업그레이드가 필요할 때 어떻게 해야하는 지를 설명합니다.
픽셀 단위 쉐이더 (Per-pixel lit shaders)
유니티 2.x에서는 쉐이더가 픽셀 단위의 빛을 내는 것은 아주 복잡했습니다. 그런 쉐이더는 LightMode
태그가 켜진 (보통 PixelOrNone, Vertex 그리고 Pixel) 여러 개의 경로를 가졌습니다. 유니티 3.x에서 추가된 Deferred Lighting 과 오래된 포워드 렌더링의 변화로 좀 더 간단하고 견고하고 미래를 보장하는 빛과 상호작용하는 쉐이더 쓰는 방법이 필요하였습니다. _모든 오래된 픽셀 단위의 쉐이더는 Surface Shaders로 다시 쓰여져야 합니다_ .
Cg 쉐이더 변화
내장된 변수 "glstate"에 다시 이름주기
유니티 2.x에서는 어떤 내장된 변수(예를 들어model*view*projection matrix)에의 접근은 내장된 Cg이름(예를 들어glstate.matrix.mvp
) 을 통해 가능합니다. 그러나 어떤 플랫폼에서는 그것이 작동하지 않는다. 그래서 유니티3.x에서는 그 내장된 변수의 이름을 다시 정하게 되었습니다. 이 모든 대체는 사용자 프로젝트가 업그레이드 될 때 자동으로 이루어 질 것입니다:
glstate.matrix.mvp
를 UNITY_MATRIX_MVP로glstate.matrix.modelview[0]
를 UNITY_MATRIX_MV로glstate.matrix.projection
를 UNITY_MATRIX_P로glstate.matrix.transpose.modelview[0]
를 UNITY_MATRIX_T_MV로glstate.matrix.invtrans.modelview[0]
를 UNITY_MATRIX_IT_MV로glstate.matrix.texture[0]
를 UNITY_MATRIX_TEXTURE0로glstate.matrix.texture[1]
를 UNITY_MATRIX_TEXTURE1로glstate.matrix.texture[2]
를 UNITY_MATRIX_TEXTURE2로glstate.matrix.texture[3]
를 UNITY_MATRIX_TEXTURE3로glstate.lightmodel.ambient
를 UNITY_LIGHTMODEL_AMBIENT로glstate.matrix.texture
를 UNITY_MATRIX_TEXTURE로
Semantics 변화
추가로vertex-to-fragment구조에서의 위치를 위해서 SV_POSITION
(POSITION
대신)를 사용하는 것을 귄장합니다.
엄격한 에러 확인
플랫폼에 따라 쉐이더는 조금더 엄격한 에러 확인을 가진Cg(예를 들어 윈도우즈에서의 HLSL) 이외의 다른 컴파일러로 컴파일될 수 있습니다. 대부분의 공통된 경우들:
- 모든 vertex/fragment 쉐이더 입력과 출력은 “semantics”의 할당을 필요로 합니다. 유니티 2.x에서는 semantics를 할당하지 않는 것이 가능했습니다(이런 경우 TEXCOORD가 쓰임). 유니티 3.x에서는 semantic을 필요로 합니다.
- 모든 쉐이더 출력 변수들은 쓰여져야 합니다. 예를 들어, 사용자가 꼭지점 쉐이더의 출력으로 float4 color : COLOR를 가지고 있다면 사용자는 단지 rgb에 쓰고 알파를 초기화하지 않을 수 없습니다.
다른 변경 사항
RECT 텍스쳐는 더이상 없습니다
유니티 2.x에서 RenderTextures는 “RECT”텍스쳐로 불리는 2의 제곱수의 크기를 갖지 않을 수 없었습니다. 그 것은 쉐이더 속성에서 “RECT” 텍스쳐로 명시되었고 Cg 쉐이더에서 samplerRECT
와 texRECT
등으로 사용되었습니다. OpenGL에서는 RECT 텍스쳐를 위한 텍스쳐 좌표는 특별한 케이스 였습니다. 그 것은 픽셀로 되었었습니다. 다른 모든 플랫폼에서는 텍스쳐 좌표는 다른 어떤 텍스쳐와도 같았습니다. 그것은 텍스쳐위에 0.0부터 1.0로 표기되었습니다.
유니티 3.0에서는 이 OpenGL의 특별한 케이스를 제거하기로 결정하여서 2의 제곱수가 아닌 크기의RenderTextures 도 모든 곳에서 동일하게 여겨졌습니다. samplerRECT
, texRECT
또는 비슷한 사용을 보통의 sampler2D
와 tex2D
로 바꿀 것을 권합니다. 또한 OpenGL을 위해 특별한 픽셀 주소를 사용하고 있다면 쉐이더에서 그것을 제거할 필요학 있습니다. 즉 OpenGL부분이 아닌 부분만 남기십시오 (쉐이더에서 SHADER_API_D3D9
또는 SHADER_API_OPENGL
매크로를 찾으십시오).
- 출처: 유니티코리아위키 (CC BY-NC-SA 2.0)