공대 컴린이 2023. 8. 22. 13:42
728x90

설명

인스턴싱이란 동일한 객체를 한 화면에 여러 개 렌더링 시킬 경우 한번의 DP Call로 처리하는 방식을 말합니다. 예를 들어 수많은 나무, 풀, 파티클 같은 객체들에 적용할 수 있습니다.

 

정의

동일한 객체(모델)을 한 화면에 여러 개 렌더할 때 batch 최적화를 통한 최적의 성능을 발휘할 수 있게 하는 기법

 

Batch란 모든 DrawIndexedPrimitive 함수를 콜 하는 것을 말합니다. 즉, HAL 함수를 최대한 적게 부르는 것이 Batch의 최적화라고 할 수 있습니다.

 

모델 정보를 담고 있는 하나의 정점 버퍼와 인스턴스 버퍼라는 각 복사본의 변경점들만 담은 두번째 버퍼를 사용하여 인스턴싱을 구현할 수 있고, 정점 버퍼는 그래픽 카드에 계속 캐싱되어 있고 인스턴스 버퍼의 내용대로 바뀌어 그려지게 됩니다.

 

인스턴싱에서 중요한 점은, 렌더링은 나누는 것보다 모으는 것이 빠르기 때문에배치는 크게 하고 렌더링은 적게 하는 것입니다. (드로우 콜 줄이고, 캐시 미스 줄이고, 렌더 상태설정 줄이고, 텍스처 설정 줄이고)

 

인스턴싱을 적용하는 방법으론, Vertex Shader를 사용하는 방법과, Dynamic Buffer를 사용하는 방법 등이 있습니다.

Vertex Shader 방법

Vertex Shader를 사용하면 빠른 속도를 보장하고, Buffer에 Lock을 걸지 않아도 된다는 장점이 있지만, 쉐이더 상수의 개수 제한으로 한꺼번에 수백개 이상은 그리지 못한다는 점과, Skinning Shader 같이 쉐이더 상수를 많이 사용하는 방법과 병행할 수 없습니다. 또한 DP콜이 Dynamic Buffer 방법에 비해 상대적으로 많다는 단점이 있습니다.

 

Dynamic Buffer 방법

Dynamic Buffer를 사용하면 버퍼의 크기만큼 인스턴싱이 가능하므로 Shader보다 더 많이 적용시킬 수 있고, 스키닝 애니메이션이나 Shader와 연계되지 않습니다. 또한 DP 콜이 Shader보다 상대적으로 적다는 장점이 있습니다. 반면, Lock을 걸어야 하기 때문에 부하가 상당히 크다는 단점이 있습니다.

 

Buffer의 Lock, UnLock

Lock은 메모리로 참조하고 있는 상태에서 데이터를 접근하면 안되기 때문에 안전핀을 꼽아놓는 것과 같은 역할의 함수이다.

UnLock은 안전핀을 뽑는 함수이다.


https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=jungjin02&logNo=20054821222 

 

[기술정리] 인스턴싱(Instancing)

안녕하세요. 최정진 입니다.   개인적으로 게임 제작에 관한 공부를 위해 발버둥 치고 있습...

blog.naver.com

https://blog.nullbus.net/82

 

DirectX11 Tutorial 37: 인스턴싱

원문: Tutorial 37: Instancing 그래픽스 엔진은 종종 위치나 크기, 색상 등의 것들은 다르지만 모양은 똑같은 물체를 아주 많이 그려야 하는 기능이 필요할 때가 있습니다. 그렇게 수백 수천의 다른 모

blog.nullbus.net

https://m.blog.naver.com/jsjhahi/199981820

 

버텍스 버퍼 ( Vertex Buffer ) 와 인덱스 버퍼 ( Index Buffer ), 버텍스의 Lock(), UnLock()

  [ Vertex의 데이터를 화면에 그려지기 위해서 버퍼가 필요하다. ]   버퍼란 어떠한 데이터를 ...

blog.naver.com

 

728x90