

참고 : 다른 배칭 방법으로 메시 수동으로 결합하여 스태틱 배칭처럼 구현하는 방법을 수동배치라하며 이건 컬링이 안됨. 수동 배치 방법 : Mesh.CombineMeshes 통해 또는 미리 에셋에서 결합하여 구현
경고 : C# 스크립트에서 공유 머티리얼 프로퍼티에 액세스할 때 Renderer.material이 아닌 Renderer.sharedMaterial을 사용해야 합니다. Renderer.material은 머티리얼 사본을 만들고 사본을 렌더러에 다시 할당합니경고: C# 스크립트에서 공유 머티리얼 프로퍼티에 액세스할 때 Renderer.material이 아닌 Renderer.sharedMaterial을 사용해야 합니다. Renderer.material은 머티리얼 사본을 만들고 사본을 렌더러에 다시 할당합니다. 이렇게 하면 Unity가 해당 렌더러에 대한 드로우 콜을 배칭하지 않습니다.다. 이렇게 하면 Unity가 해당 렌더러에 대한 드로우 콜을 배칭하지 않습니다. (동일 머테리얼을 사용해야하기 때문)
GPU에 배칭을 맡기는 방법으로 내부적으로 Graphics.DrawMeshInstanced 호출하여 배칭하는데 게임 오브젝트 사용을 우회하고 지정된 파라미터를 사용하여 화면에 메시를 직접 드로우. 메시 하나만, 트랜스폼 정보만을 전달하여 메모리에 넣고 GPU가 그리는것이다.
머테리얼 -> advanced options 에서 GPU 인스턴싱 옵션을 on
이 방법은 SRP Batcher 상호 호환되지 않는다. 그래서 SRP 배쳐가 된다면 GPU 인스턴싱을 사용하지 못해 SRP Batcher를 꺼야되는데, 그러지 않고 굳이 쉐이더가 SRP 를 지원하지 않으면 GPU 인스턴싱이 되므로 GPU 인스턴싱만 쓰는게 아니라면 굳이 끄지 않아도 된다.
배칭이 적용됨에도 불구하고 MaterialPropertyBlock을 통해서 머테리얼마다 파라미터를 변경 가능(이해, 추가 설명 필요)
제한사항 - 동일 메시, 동일 머테리얼의 경우 배칭, 기본적 shader중 지원하는것 있음
WebGL 1.0 제외한 모든 플랫폼 호환되며 Standard, Surface 쉐이더 지원함. SkinnedMeshRenderers 지원 하지 않음.
엄청나게 많은 오브젝트가 모두 하나의 배치로 되는건 아니고 어느정도 그룹화 되어 일정 개수가 넘어가면 페이징 처리되어 배치가 1개 더 늘어난다.
프레임 디버거에서는 RenderLoop Draw라 표기되며 아래 Draw Instanced calls라고 표기가 별도로 된다.(즉 GPU Instacing으로 한 번 그렸다는말)
커스텀 쉐이더에 GPU Instacning 지원에 필요한 셰이더 키워드, 변수 및 함수가 있으며
GPU 인스턴싱을 지원하는 셰이더 생성 참조
하나의 메시에 256개 미만의 버택스를 가질경우 퍼포먼스가 더 안 좋을 수 있는 경우도 있음 아래 공식 가이드를 참고
버텍스 수가 적은 메시는 GPU 인스턴싱을 사용하여 효율적으로 처리할 수 없습니다. GPU가 GPU 리소스를 완전히 사용하는 방식으로 작업을 배포할 수 없기 때문입니다. 이러한 비효율적인 처리는 퍼포먼스에 부정적인 영향을 미칠 수 있습니다. 비효율성이 시작되는 임계값은 GPU에 따라 다르지만 일반적으로 256개 미만의 버텍스를 가진 메시에는 GPU 인스턴싱을 사용하지 않습니다.
버텍스 수가 적은 메시를 여러 번 렌더링하려는 경우 모든 메시 정보가 포함된 단일 버퍼를 생성하여 메시를 드로우하는 것이 가장 좋습니다.