프로그래밍 공부/렌더링

유니티 셰이더&렌더링 (1)

빅토리아레몬탄산수 2021. 5. 10. 16:13

화면에 색을 칠하는(Shading) 프로그램

동작방식 : 렌더링 파이프라인의 일부를 유연하게 변경하는 프로그램

렌더링 파이프라인의 일부 중 프로그래머가 수정하게 열어주었고 그걸 셰이더라고 부른다.

셰이더가 없을 땐 버텍스 3개를 받아서 삼각형을 만들면 다 똑같은 삼각형이였지만 셰이더로 인해 여러가지 결과가 출력이 가능하게 된것이다.

유니티는 서피스 셰이더, 버텍스/프래그먼트 셰이더, 고정함수 셰이더 총 3가지의 셰이더를 지원합니다.]

주로 사용하는건 서피스, 버텍스/프래그먼트이며 

버텍스 셰이더는 정점의 정보값을 변화시켜서, 물체를 특별한 위치로 옮기거나, 텍스처를 바꾸거나, 색상을 바꾸는 등의 일을 할 수 있다. 하지만 기존의 정점을 지우거나 새로운 정점을 추가하는 등의 작업은 할 수 없다.

프래그먼트 셰이더는 최종 출력될 색을 채워 넣는 일을 한다. (이미 밑그림이 완성된 종이를 받아서 그위에 색을 칠하는 일)

그리고 셰이더는 한번에 그리는게 아닌 한번에 여러개를 실행하는 형식으로 만들어진다.

예로 3개의 버텍스를 받아서 삼각형을 그릴 시 1개 버텍스씩 찍고 한번에 3개를 실행한다.(여러가지를 한번에)

 

렌더링 파이프를 이제 뜯어볼 생각입니다. 렌더링 파이프가 실행 되기 전에 그래픽스 API 초기화 한번 실행해야합니다.

과정은 GPU 디바이스 생성 <-> 커맨드 큐 생성 - 렌더링 파이프라인 상태 생성

GPU 디바이스 생성 - 현재 기기의 GPU를 표현하는 오브젝트 한번만 생성, 하나만 존재

커맨드 큐로 부터 커맨드를 받아들여 실행

 

커맨드 큐 - GPU에게 전달할 명령을 쌓아두는 곳, 한번만 생성, 하나만 존재, GPU 디바이스로 이어짐

CPU와 GPU의 속도를 맞춰 자원 낭비를 막기 위해 CPU에서 명령을 내린걸 커맨드 큐에서 명령을 예약하고 하드웨어 언어로 번역하여 커맨드 버퍼에 쌓고 성능에 맞춰 GPU가 빼가는것 (즉시 실행되는게 아님)

렌더링 파이프라인 상태 생성 - 렌더링 파이프라인의 상태를 표현, 렌더링 파이프라인에 사용할 속성들을 가짐, 여러개 생성 가능

상태를 표기한걸 렌더링 파이프라인 서술자라고 표기하며 렌더링 파이프라인이 어떤식으로 동작할 지 묘사하는 오브젝트이다. 그중 정점 서술자는 정점의 구성을 묘사하며 정점을 조립할 때 사용

위 작업이 끝나면 마지막으로 사용할 데이터 로드 (모델, 텍스쳐등) RAM에서 그래픽카드로 전송할 데이터를 RAM에 올려 놓는다. 삼각형을 보낼 시 3개의 정점에 대한 데이터를 가지고 있고 이걸 메모리에 올릴 것이다. 물론 게임 엔진이 알아서 올려준다. 하지만 주의 해야할 사항은 요기서 정점은 위치만을 가르치는게 아니고 위치는 정점의 속성 중 하나 일뿐입니다.

요기까지가 렌더링 파이프라인전 실행되는 그래픽스 API 초기화 과정이였습니다.  물론 유니티에선 다룰 일은 없습니다. 하지만 이해하고 가면 좋을것 같아서 공부하였습니다.

드로우 콜은 GPU가 처리하기 전 단계인 드로우 콜은 최적화에 있어서 중요한 단계라고 합니다. 여러 방법이 있지만 나중에 공부하여 다뤄보도록 하겠습니다. 일단 역할은 오브젝트를 한번 그리는데 필요한 명령들의 묶음입니다. 이건 따로 게시글로 다뤄볼 예정이니 대략적인 개념만 잡고 가겠습니다. 이렇게 GPU로 넘어가면 될것 같습니다.