개념
- 유니티는 Material의 속성으로 Shader가 사용되며 서로 다름
- 다른 게임 엔진은 같은 뜻으로 쓰기도함
그래픽스 라이브러리, API
- 유니티는 멀티 플랫폼을 지원하며 다양한 그래픽 칩셋을 다음과 같이 지원
-
- OpenGL(Open Graphic Library)
- 에디터에서의 그래픽 API가 타겟 디바이스와는 다르고 모든 그래픽 칩셋마다 깨지거나, 지원하지 않는 설정으로 표현되지 않을 수 있음
- Auto Graphics API로 자동으로 어떤 API를 사용할것인지, 아니면 지정할 수 있음
- Auto는 심플하지만 최적화나, 패키지 사이즈를 줄이거나, 버그가 생길때 대응하기 위해 운영체제 마다 그래픽스 API를 명시해주는것을 추천
- API 마다 명령어가 다르긴하지만 렌더링 파이프라인이라는 공통 과정을 거침
렌더링 파이프라인
- 렌더링 파이프 라인
메모리
- CPU와 GPU가 사용하는 메모리는 다르며, 모바일은 메모리를 공용으로 쓰지만 영역이 분리되어있기도 함(아닌경우도 있나?)
- 메시 데이터, 쉐이더, 머테리얼 데이터 모두 Memory가 위 사진처럼 전달
Rendering
- 메모리에 올려진 데이터가 Render State 체크하여 그려지며, State가 바뀐다면 바뀐 오브젝트만 새로 GPU에게 그리라 명령
- 상태 하나하를 바꾸기위해 CPU가 커맨드를 날려서 GPU에게 명령
- 렌더링을 위해 많은수의 쉐이더 코드를 사용하며 각각 쉐이더가 프로그램이 되어 GPU에 올라가며 그 프로그램들을 이용하여 렌더링을 하게됨
- 유니티는 쉐이더 코드가 하나인데 최종적으로 쪼개져서 메모리에 올라감
- 쉐이더를 많이쓰거나, 쉐이더 variant가 많으면 위 프로그램이 자주 바꾸면서 성능에 영향을 줄 수 있음
- 렌터링 파이프 라인을 다이렉트X 예시로 아래 코드로 간략히 설명