Unity 5 렌더링 파이프라인 확장: 명령 버퍼

ARAS PRANCKEVIČIUS Anonymous
Feb 6, 2015|3 분
Unity 5 렌더링 파이프라인 확장: 명령 버퍼
이 웹페이지는 이해를 돕기 위해 기계 번역으로 제공됩니다. 기계 번역으로 제공되는 콘텐츠에 대한 정확도나 신뢰도는 보장되지 않습니다. 번역된 콘텐츠의 정확도에 관해 의문이 있는 경우 웹페이지의 공식 영어 원문을 참고해 주시기 바랍니다.

Unity 5에서는 새로운 표준 셰이더, 실시간 전역 조명, 반사 프로브, 새로운 라이트매핑 워크플로 등 사용자가 눈에 보이는 그래픽스 기능을 많이 추가했지만, 내부 렌더링 작업도 함께 진행했습니다. "최적화 "(예: 멀티스레드 라이트 컬링 ) 및 "일관성 향상 "(예: 리니어 및 감마 색 공간 간 일관성 향상)과 같은 일반적인 것 외에도 다음과 같은 방법을 살펴봤습니다. 보다 확장성.

내부적으로 그리고 베타 테스트 그룹 내에서 다양한 접근 방식을 논의했습니다. 더 많은 스크립트 콜백, 작은 "여기 할 일 목록" 버퍼 조립, 완전한 렌더링 파이프라인을 처음부터 생성하는 기능, 일종의 비주얼 트리/그래프 렌더링 파이프라인 구성 도구 등 많은 아이디어가 쏟아졌습니다. Unity 5에서는 '할 일 목록' 버퍼를 생성하는 기능을 '명령 버퍼'라고 부르기로 결정했습니다.

그래픽의 명령 버퍼는 실행할 명령의 낮은 수준의 목록입니다. 예를 들어 Direct3D 또는 OpenGL과 같은 3D 렌더링 API는 일반적으로 명령 버퍼를 구성한 다음 GPU에서 실행합니다. 또한 Unity의 멀티스레드 렌더러는 호출 스레드와 렌더링 API에 명령을 제출하는 '작업자 스레드' 사이에 명령 버퍼를 구성합니다.



우리의 경우 아이디어는 매우 유사하지만 '명령'은 다소 높은 수준입니다. "내부 GPU 레지스터 X를 Y 값으로 설정"과 같은 명령 대신 "이 메시를 해당 머티리얼로 그려"와 같은 명령이 있습니다.

스크립트에서 명령 버퍼를 생성하고 렌더링 명령을 추가할 수 있습니다("렌더링 대상 설정, 메시 그리기, ..."). 그런 다음 이러한 명령 버퍼를 카메라 렌더링 중 다양한 지점에서 실행되도록 설정할 수 있습니다.

예를 들어 모든 일반 오브젝트가 완료된 후 일부 추가 오브젝트를 디퍼드 셰이딩 G-버퍼로 렌더링할 수 있습니다. 또는 스카이박스가 그려진 직후에 다른 모든 것보다 먼저 구름을 렌더링할 수도 있습니다. 또는 모든 일반 조명이 완료된 후 사용자 지정 조명(볼륨 조명, 네거티브 조명 등)을 디퍼드 셰이딩 조명 버퍼에 렌더링합니다. 그 외에도 흥미로운 활용 방법이 많이 있다고 생각합니다.

스크립팅 API 문서에서 CommandBufferCameraEvent 페이지를 살펴보세요.

사진을 찍지 않으면 일어나지 않았습니다!

알았어요.

예를 들어 흐릿한 굴절을 할 수 있습니다:

RenderingCommandBufferBlurryRefraction

불투명 오브젝트와 스카이박스가 렌더링되면 현재 이미지가 임시 렌더 타깃에 복사되고 흐리게 처리되어 전역 셰이더 프로퍼티로 설정됩니다. 그런 다음 유리 오브젝트의 셰이더는 굴절을 시뮬레이션하기 위해 노멀 맵을 기반으로 UV 좌표 오프셋을 사용하여 흐린 이미지를 샘플링합니다. 이는 셰이더 GrabPass의 기능과 비슷하지만, 더 많은 커스텀 작업(이 경우 블러)을 할 수 있다는 점이 다릅니다.

또 다른 사용 사례는 사용자 지정 지연 조명입니다. 다음은 구형 및 튜브형 조명입니다:

RenderingCommandBufferCustomLights

일반 디퍼드 셰이딩 라이트 패스가 완료되면 조명을 계산하여 조명 버퍼에 추가하는 셰이더를 사용하여 각 커스텀 라이트에 대해 구를 그립니다.

또 다른 예로 지연된 데칼을 들 수 있습니다.

RenderingCommandBufferDecals

G-버퍼를 완성한 후 데칼의 각 '모양(상자)'을 그리고 G-버퍼 내용을 수정하는 것입니다. 이는 디퍼드 셰이딩에서 조명을 처리하는 방식과 매우 유사하지만, 조명을 누적하는 대신 G-버퍼 텍스처를 수정한다는 점이 다릅니다.

이미지

각 데칼은 여기서 상자로 구현되며, 상자 볼륨 내부의 모든 지오메트리에 영향을 줍니다.

실제로 위의 모든 내용을 보여주는 작은 Unity(5.0 베타 22) 프로젝트 폴더가 있습니다: RenderingCommandBuffers50b22.zip.

위의 모든 사례는 구현하기 복잡하지도 않으며, 스크립트는 약 수백 줄의 코드로 구성되어 있습니다.

정말 흥미로운 일이라고 생각합니다. 여러분들이 어떻게 활용할지 기대가 됩니다!