본문 바로가기

engine

[Unity3D] renderer.material 과 renderer.sharedMaterial의 차이점

renderer.material은 renderer에 소속된 재질입니다. 특정 렌더러의 전용 재질로 사용됩니다.
sharedMaterial은 여러 renderer들이 공유해서 사용하는 재질입니다. 여러 렌더러들이 공유해서 사용하도록 설계되어있습니다.
이의 구분을 위해 재질에는 소유자(owner) 정보가 들어있으며, 이를 통해 재질이 특정 렌더러에 전용인지, 공유인지를 판단합니다.

render.sharedMaterial은 renderer에 할당된 재질의 레퍼런스를 그대로 돌려줍니다. 
하지만 render.material은 가져올 재질의 소유자 정보를 먼저 검사하고, 소유자가 renderer가 아니라면 원래 할당된 재질의 레퍼런스를 주는 것이 아닌 재질을 동일하게 복사하여 생성한 후에 돌려줍니다. 

아래와 같은 경우 material이 호출될 때마다 리소스가 증가됩니다.
Material myMaterial = Resource.Load(새로운 재질);
renderer.sharedMaterial = myMaterial;
renderer.material.SetTextureOffset(재질 변경);

아래의 경우는 리소스가 증가하지 않습니다.
Material myMaterial = Resource.Load(새로운 재질);
renderer.material = myMaterial;
renderer.material.SetTextureOffset(재질 변경);

아래도 증가하지 않습니다.
Material myMaterial = Resource.Load(새로운 재질);
renderer.sharedMaterial = myMaterial;
renderer.sharedMaterial.SetTextureOffset(재질 변경);

특히 재질을 애니메이션 시키고자 할 때는, 이를 주의해서 사용해야 합니다. 
안그러면 리소스릭이 발생하게 됩니다.


'engine' 카테고리의 다른 글

Unity 2side map  (3) 2013.08.30
Unity3D - 최적화를 위한 CombineMesh  (5) 2013.06.25
Unity3D - iOS ShaderLab (Offset)  (0) 2013.06.24
Unity  (0) 2013.06.21
Unity3D - fake slicer  (2) 2013.06.03