SlideShare a Scribd company logo
1 of 18
Download to read offline
Indirect Drawing with Unity
Unity 렌더링 구조
로직
유저가 만든 렌더링
커맨드들
MeshRender,
Graphics.Draw,
등등~
CommandBuffer
생성
렌더 파이프
현재 환경과 설정된
렌더 파이프에
맞추어 실제 실행할
렌더커맨드 생성
LWRP, HDRP,
Built-in Legacy
RenderCommandB
uffer 생성
렌더 Context
렌더커맨드를 API
명령어로 호출
RenderingComma
ndBuffer 실행
실제 그래픽 API
함수 호출
Graphic API
DirectX, openGL
드라이버를 통해
GPU에 실제그리기
메인 스레드( C# ) 렌더 스레드( C++ )
렌더파이프의 역활
유저가 그린
오브젝트들
CommandBuffer
월드 정보들
( 카메라 정보,
라이팅 정보)
렌더 환경 정보들
( 모션벡터,
후처리, API 정보)
랜더파이프
● Culling
● Sorting
● Data Updating
● Environment
Setting
● Etc….
RanderCommand
Buffer 생성
렌더 스레드 역할
https://unity3d.com/kr/learn/tutorials/topics/best-practices/multithreaded-rendering-graphics-jobs#Graphics%20Jobs
현재 Main + Render thread 형식이 기본
로우 레벨API ( Vulkan / DX12 ) 는 Main thread 아닌곳에서도RCMD 생성 가능
SRP는 렌더쓰레드가현재 강제? ( 초기버전은 꺼졌는데 현재 5.2.3버전 안꺼짐 )
Unity 로직에서 커맨드 만드는 방법들
1. Renderer 컴포넌트 사용 ( MeshRenderer, SkinnedMeshRenderer )
2. 코드에서 직접 그리기 ( Graphics.Draw 명령어들 DrawMesh )
3. Graphics API 로 그리기
• 카메라 GameObject에 붙힌 컴포넌트의 특정 함수에서만 동작
OnPostRender, OnPreRender
• OpenGL을 랩핑한 UnityEngine.GL 을 명령어 사용
• SRP에서 사용불가
Renderer = Graphics.Draw
Renderer는 Inspector일뿐, 결국 Graphics.Draw 와 똑같이 CommandBuffer생성
CommandBuffer
Normal, Instancing, Indirect Draw의 다른점
렌더링의 시작인 VertexShader 까지 언제 어떻게 데이타를 넘기냐의 차이
Vertex Shader
그리기 위한
정보들
Normal Draw Call
Vertex Shader
버텍스
버퍼
인덱스
버퍼
버텍스
정보
SetTransform
머터리얼 정보
유니폼 데이터
( 모든 쉐이더가 같이 공유하는 데이터 )
CPU GPU
SetIB
SetVB
Draw
Instancing Draw Call
Vertex Shader
버텍스
버퍼
인덱스
버퍼
버텍스
정보
SetTransformList
머터리얼 정보
유니폼 데이터
SetIB
SetVB
인스터스
ID리스트 ID 인스턴스
마다 다른
Transform
DrawInstancing
Indirect Draw 는 두 단계이다.
Indirect는 그릴때 데이터를 보내지 않는다. 그리기 명령어와 데이터를 GPU에 보내는 것이 분리된다.
1단계 - 데이터 올리기
2단계 - 그리기
옵션 - 필요하면 데이터 Update하기 ( compute shader )
Instancing Draw Call - Data 올리기
Compute Shader
그리기 위한 모든 정보
컴퓨트 버퍼
( 일정간격마다 유니폼 데이터 )
버퍼 상태 업데이트
( ex: 컬링여부, 데이타
업데이트 )
Dispatch(optional)
유니폼
데이터
SetIBList
SetVBList
인덱스
버퍼들
버텍스
버퍼들
Instancing Draw Call - 2단계 그리기
Vertex Shader
컴퓨트 버퍼
( 일정간격마다 유니폼 데이터 )
DrawIndirect
유니폼
데이터
인덱스
버퍼들
버텍스
버퍼들
유니폼
데이터
인덱스
버퍼
버텍스
버퍼
컴퓨트 버퍼의 일정간격 마다(Stride) 하나의 Draw Call 이 된다.
Draw VS DrawInstance VS DrawIndirect
동일 shader로 10개 Material을 만들고 10개 Mesh를 이용해 10x10 = 100종의 오브젝트를 만든다
오브젝트를 100개씩 그린다. ( 1 x 10 x 10 x 100 = 10000 개의 인스턴스 )
for( material ){
for( texture ){
for ( mesh ){
for ( Instance ){
SetUniformData()
Draw();
}}}}
Once
10 = 10 setTexture
Per Frame
10x10x100 = 10000 SetData
10x10x100 = 10000 draw call
for( material ){
for( texture ){
for ( mesh ){
SetUniformDataList()
InstancingDraw();
}}}
Once
10 = 10 setTexture
Per frame
10x10 = 100 SetData
10x10 = 100 draw call
for( shader ){
if( needUpdateBuffer )
UpdateBuffer();
IndirectDraw();
}
Once
10 = 10 setTexture
1 = 1 SetData
Per frame
1 = 1 draw call
Indirect Draw 사용법
Indirect Draw는 아직은 직접 명령어로만 가능 ( 아마 앞으로도.. )
DX11에 상응하는 API 필요 ( ES3.1, METAL, VULKAN )
실질적으로 엔진 렌더파이프라인을 건너 뜀 ( culling, sorting, updating X )
직접 모든 데이타를 compute shader를 이용해서 관리해야함
Indirect Draw 사용법
실제코드는 굉장히 간단, 5분이면 테스트 가능
( 데이터 올리고 그리는 10줄, 쉐이더에 10줄 추가로 끝~ )
예제:
https://docs.unity3d.com/2019.1/Documentation/ScriptReference/Graphics.Draw
MeshInstancedIndirect.html
Indirect Draw 실제 사용
기존 쉐이더마다 Indirect용으로 컨버팅하기 번거로워 유니티에서 실용적인
Indirect 쉐이더 디자인패턴을 제공
#pragma instancing_options procedural:FunctionName 옵션을 이용해서
인스턴스마다 유니폼버퍼들을 재설정하는 방식의 코드를 추가하고 이전쉐이더
상태 그대로 사용하는 것이 보통임
이전쉐이더에 위의 전처리 한줄만 추가하면 됨 ( 유니티 짱! )
Indirect Draw 실제 사용
인스턴스마다의 정보를 업데이트 한다.
void IndirectSetupInstance()
{
#ifdef UNITY_PROCEDURAL_INSTANCING_ENABLED
// 인스턴스에 맞는 global 변수 업데이트
// unity_ObjectToWorld,unity_WorldToObject,그 외 버퍼들
#endif
}
#pragma instancing_options procedural:IndirectSetupInstance
Thank you!

More Related Content

What's hot

멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)Bongseok Cho
 
빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술YEONG-CHEON YOU
 
Parallel Graphics in Frostbite - Current & Future (Siggraph 2009)
Parallel Graphics in Frostbite - Current & Future (Siggraph 2009)Parallel Graphics in Frostbite - Current & Future (Siggraph 2009)
Parallel Graphics in Frostbite - Current & Future (Siggraph 2009)Johan Andersson
 
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012devCAT Studio, NEXON
 
NDC2011 - 절차적 지형과 트렌드의 추적자들
NDC2011 - 절차적 지형과 트렌드의 추적자들NDC2011 - 절차적 지형과 트렌드의 추적자들
NDC2011 - 절차적 지형과 트렌드의 추적자들Jubok Kim
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기Jaeseung Ha
 
AAA게임_UI_최적화_및_빌드하기.pptx
AAA게임_UI_최적화_및_빌드하기.pptxAAA게임_UI_최적화_및_빌드하기.pptx
AAA게임_UI_최적화_및_빌드하기.pptxTonyCms
 
[NDC2017] 딥러닝으로 게임 콘텐츠 제작하기 - VAE를 이용한 콘텐츠 생성 기법 연구 사례
[NDC2017] 딥러닝으로 게임 콘텐츠 제작하기 - VAE를 이용한 콘텐츠 생성 기법 연구 사례[NDC2017] 딥러닝으로 게임 콘텐츠 제작하기 - VAE를 이용한 콘텐츠 생성 기법 연구 사례
[NDC2017] 딥러닝으로 게임 콘텐츠 제작하기 - VAE를 이용한 콘텐츠 생성 기법 연구 사례Hwanhee Kim
 
엄재민 Nhn과제 신규 게임 컨셉 제안서
엄재민 Nhn과제 신규 게임 컨셉 제안서엄재민 Nhn과제 신규 게임 컨셉 제안서
엄재민 Nhn과제 신규 게임 컨셉 제안서재민 엄
 
2009-2016 기본기(손맵)의 중요성
2009-2016 기본기(손맵)의 중요성2009-2016 기본기(손맵)의 중요성
2009-2016 기본기(손맵)의 중요성Gunho Shin
 
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012devCAT Studio, NEXON
 
NDC 2015. 한 그루 한 그루 심지 않아도 돼요. 생태학에 기반한 [야생의 땅: 듀랑고]의 절차적 생성 생태계
NDC 2015. 한 그루 한 그루 심지 않아도 돼요. 생태학에 기반한 [야생의 땅: 듀랑고]의 절차적 생성 생태계NDC 2015. 한 그루 한 그루 심지 않아도 돼요. 생태학에 기반한 [야생의 땅: 듀랑고]의 절차적 생성 생태계
NDC 2015. 한 그루 한 그루 심지 않아도 돼요. 생태학에 기반한 [야생의 땅: 듀랑고]의 절차적 생성 생태계Imseong Kang
 
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 2부
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 2부NDC 2010 이은석 - 마비노기 영웅전 포스트모템 2부
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 2부Eunseok Yi
 
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리MinGeun Park
 
오승준, 사회적 기술이 프로그래머 인생을 바꿔주는 이유, NDC2011
오승준, 사회적 기술이 프로그래머 인생을 바꿔주는 이유, NDC2011오승준, 사회적 기술이 프로그래머 인생을 바꿔주는 이유, NDC2011
오승준, 사회적 기술이 프로그래머 인생을 바꿔주는 이유, NDC2011devCAT Studio, NEXON
 
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅DongMin Choi
 
유니티 그래픽 최적화, 어디까지 해봤니 (Optimizing Unity Graphics) NDC15 Ver.
유니티 그래픽 최적화, 어디까지 해봤니 (Optimizing Unity Graphics) NDC15 Ver.유니티 그래픽 최적화, 어디까지 해봤니 (Optimizing Unity Graphics) NDC15 Ver.
유니티 그래픽 최적화, 어디까지 해봤니 (Optimizing Unity Graphics) NDC15 Ver.ozlael ozlael
 
Ndc2010 전형규 마비노기2 캐릭터 렌더링 기술
Ndc2010 전형규   마비노기2 캐릭터 렌더링 기술Ndc2010 전형규   마비노기2 캐릭터 렌더링 기술
Ndc2010 전형규 마비노기2 캐릭터 렌더링 기술henjeon
 
모바일 게임 최적화
모바일 게임 최적화 모바일 게임 최적화
모바일 게임 최적화 tartist
 

What's hot (20)

멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)
 
빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술
 
Parallel Graphics in Frostbite - Current & Future (Siggraph 2009)
Parallel Graphics in Frostbite - Current & Future (Siggraph 2009)Parallel Graphics in Frostbite - Current & Future (Siggraph 2009)
Parallel Graphics in Frostbite - Current & Future (Siggraph 2009)
 
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
 
NDC2011 - 절차적 지형과 트렌드의 추적자들
NDC2011 - 절차적 지형과 트렌드의 추적자들NDC2011 - 절차적 지형과 트렌드의 추적자들
NDC2011 - 절차적 지형과 트렌드의 추적자들
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
 
AAA게임_UI_최적화_및_빌드하기.pptx
AAA게임_UI_최적화_및_빌드하기.pptxAAA게임_UI_최적화_및_빌드하기.pptx
AAA게임_UI_최적화_및_빌드하기.pptx
 
[NDC2017] 딥러닝으로 게임 콘텐츠 제작하기 - VAE를 이용한 콘텐츠 생성 기법 연구 사례
[NDC2017] 딥러닝으로 게임 콘텐츠 제작하기 - VAE를 이용한 콘텐츠 생성 기법 연구 사례[NDC2017] 딥러닝으로 게임 콘텐츠 제작하기 - VAE를 이용한 콘텐츠 생성 기법 연구 사례
[NDC2017] 딥러닝으로 게임 콘텐츠 제작하기 - VAE를 이용한 콘텐츠 생성 기법 연구 사례
 
엄재민 Nhn과제 신규 게임 컨셉 제안서
엄재민 Nhn과제 신규 게임 컨셉 제안서엄재민 Nhn과제 신규 게임 컨셉 제안서
엄재민 Nhn과제 신규 게임 컨셉 제안서
 
2009-2016 기본기(손맵)의 중요성
2009-2016 기본기(손맵)의 중요성2009-2016 기본기(손맵)의 중요성
2009-2016 기본기(손맵)의 중요성
 
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
 
NDC 2015. 한 그루 한 그루 심지 않아도 돼요. 생태학에 기반한 [야생의 땅: 듀랑고]의 절차적 생성 생태계
NDC 2015. 한 그루 한 그루 심지 않아도 돼요. 생태학에 기반한 [야생의 땅: 듀랑고]의 절차적 생성 생태계NDC 2015. 한 그루 한 그루 심지 않아도 돼요. 생태학에 기반한 [야생의 땅: 듀랑고]의 절차적 생성 생태계
NDC 2015. 한 그루 한 그루 심지 않아도 돼요. 생태학에 기반한 [야생의 땅: 듀랑고]의 절차적 생성 생태계
 
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 2부
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 2부NDC 2010 이은석 - 마비노기 영웅전 포스트모템 2부
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 2부
 
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
 
오승준, 사회적 기술이 프로그래머 인생을 바꿔주는 이유, NDC2011
오승준, 사회적 기술이 프로그래머 인생을 바꿔주는 이유, NDC2011오승준, 사회적 기술이 프로그래머 인생을 바꿔주는 이유, NDC2011
오승준, 사회적 기술이 프로그래머 인생을 바꿔주는 이유, NDC2011
 
Motion blur
Motion blurMotion blur
Motion blur
 
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
 
유니티 그래픽 최적화, 어디까지 해봤니 (Optimizing Unity Graphics) NDC15 Ver.
유니티 그래픽 최적화, 어디까지 해봤니 (Optimizing Unity Graphics) NDC15 Ver.유니티 그래픽 최적화, 어디까지 해봤니 (Optimizing Unity Graphics) NDC15 Ver.
유니티 그래픽 최적화, 어디까지 해봤니 (Optimizing Unity Graphics) NDC15 Ver.
 
Ndc2010 전형규 마비노기2 캐릭터 렌더링 기술
Ndc2010 전형규   마비노기2 캐릭터 렌더링 기술Ndc2010 전형규   마비노기2 캐릭터 렌더링 기술
Ndc2010 전형규 마비노기2 캐릭터 렌더링 기술
 
모바일 게임 최적화
모바일 게임 최적화 모바일 게임 최적화
모바일 게임 최적화
 

Similar to IndirectDraw with unity

[0312 조진현] good bye dx9
[0312 조진현] good bye dx9[0312 조진현] good bye dx9
[0312 조진현] good bye dx9진현 조
 
Modern gpu optimize blog
Modern gpu optimize blogModern gpu optimize blog
Modern gpu optimize blogozlael ozlael
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기YEONG-CHEON YOU
 
25장 레거시코드활용전략 전반부 박진호
25장 레거시코드활용전략 전반부 박진호25장 레거시코드활용전략 전반부 박진호
25장 레거시코드활용전략 전반부 박진호jinho park
 
Html5 canvas animation
Html5 canvas animationHtml5 canvas animation
Html5 canvas animationSangHun Lee
 
[0602 박민근] direct2 d
[0602 박민근] direct2 d[0602 박민근] direct2 d
[0602 박민근] direct2 dMinGeun Park
 
[0602 박민근] Direct2D
[0602 박민근] Direct2D[0602 박민근] Direct2D
[0602 박민근] Direct2D흥배 최
 
1_기초필수수학_1_벡터대수.pptx
1_기초필수수학_1_벡터대수.pptx1_기초필수수학_1_벡터대수.pptx
1_기초필수수학_1_벡터대수.pptxssuser3fb17c
 
Flash Player 11과 AIR 3 환경에서 3D 개발
Flash Player 11과 AIR 3 환경에서 3D 개발Flash Player 11과 AIR 3 환경에서 3D 개발
Flash Player 11과 AIR 3 환경에서 3D 개발Yongho Ji
 
Kgc make stereo game on pc
Kgc make stereo game on pcKgc make stereo game on pc
Kgc make stereo game on pcozlael ozlael
 
[0129 박민근] direct x2d
[0129 박민근] direct x2d[0129 박민근] direct x2d
[0129 박민근] direct x2dMinGeun Park
 
Reflow and repaint 성능 비용
Reflow and repaint 성능 비용Reflow and repaint 성능 비용
Reflow and repaint 성능 비용Doo Sung Eom
 
[122]책에서는 맛볼 수 없는 HTML5 Canvas 이야기
[122]책에서는 맛볼 수 없는 HTML5 Canvas 이야기 [122]책에서는 맛볼 수 없는 HTML5 Canvas 이야기
[122]책에서는 맛볼 수 없는 HTML5 Canvas 이야기 NAVER D2
 
120513 unity3 d_start_skyseer
120513 unity3 d_start_skyseer120513 unity3 d_start_skyseer
120513 unity3 d_start_skyseerChan-hyun Park
 
[조진현] [Kgc2011]direct x11 이야기
[조진현] [Kgc2011]direct x11 이야기[조진현] [Kgc2011]direct x11 이야기
[조진현] [Kgc2011]direct x11 이야기진현 조
 
글꼴 렌더링 이야기
글꼴 렌더링 이야기글꼴 렌더링 이야기
글꼴 렌더링 이야기Young-jun Jeong
 
[NHN_NEXT] DirectX Tutorial 강의 자료
[NHN_NEXT] DirectX Tutorial 강의 자료[NHN_NEXT] DirectX Tutorial 강의 자료
[NHN_NEXT] DirectX Tutorial 강의 자료MinGeun Park
 
[GPU Gems3] Chapter 28. Practical Post Process Depth Of Field
[GPU Gems3] Chapter 28. Practical Post Process Depth Of Field[GPU Gems3] Chapter 28. Practical Post Process Depth Of Field
[GPU Gems3] Chapter 28. Practical Post Process Depth Of Field종빈 오
 

Similar to IndirectDraw with unity (20)

[0312 조진현] good bye dx9
[0312 조진현] good bye dx9[0312 조진현] good bye dx9
[0312 조진현] good bye dx9
 
Modern gpu optimize blog
Modern gpu optimize blogModern gpu optimize blog
Modern gpu optimize blog
 
Modern gpu optimize
Modern gpu optimizeModern gpu optimize
Modern gpu optimize
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기
 
25장 레거시코드활용전략 전반부 박진호
25장 레거시코드활용전략 전반부 박진호25장 레거시코드활용전략 전반부 박진호
25장 레거시코드활용전략 전반부 박진호
 
Html5 canvas animation
Html5 canvas animationHtml5 canvas animation
Html5 canvas animation
 
[0602 박민근] direct2 d
[0602 박민근] direct2 d[0602 박민근] direct2 d
[0602 박민근] direct2 d
 
Mineral
MineralMineral
Mineral
 
[0602 박민근] Direct2D
[0602 박민근] Direct2D[0602 박민근] Direct2D
[0602 박민근] Direct2D
 
1_기초필수수학_1_벡터대수.pptx
1_기초필수수학_1_벡터대수.pptx1_기초필수수학_1_벡터대수.pptx
1_기초필수수학_1_벡터대수.pptx
 
Flash Player 11과 AIR 3 환경에서 3D 개발
Flash Player 11과 AIR 3 환경에서 3D 개발Flash Player 11과 AIR 3 환경에서 3D 개발
Flash Player 11과 AIR 3 환경에서 3D 개발
 
Kgc make stereo game on pc
Kgc make stereo game on pcKgc make stereo game on pc
Kgc make stereo game on pc
 
[0129 박민근] direct x2d
[0129 박민근] direct x2d[0129 박민근] direct x2d
[0129 박민근] direct x2d
 
Reflow and repaint 성능 비용
Reflow and repaint 성능 비용Reflow and repaint 성능 비용
Reflow and repaint 성능 비용
 
[122]책에서는 맛볼 수 없는 HTML5 Canvas 이야기
[122]책에서는 맛볼 수 없는 HTML5 Canvas 이야기 [122]책에서는 맛볼 수 없는 HTML5 Canvas 이야기
[122]책에서는 맛볼 수 없는 HTML5 Canvas 이야기
 
120513 unity3 d_start_skyseer
120513 unity3 d_start_skyseer120513 unity3 d_start_skyseer
120513 unity3 d_start_skyseer
 
[조진현] [Kgc2011]direct x11 이야기
[조진현] [Kgc2011]direct x11 이야기[조진현] [Kgc2011]direct x11 이야기
[조진현] [Kgc2011]direct x11 이야기
 
글꼴 렌더링 이야기
글꼴 렌더링 이야기글꼴 렌더링 이야기
글꼴 렌더링 이야기
 
[NHN_NEXT] DirectX Tutorial 강의 자료
[NHN_NEXT] DirectX Tutorial 강의 자료[NHN_NEXT] DirectX Tutorial 강의 자료
[NHN_NEXT] DirectX Tutorial 강의 자료
 
[GPU Gems3] Chapter 28. Practical Post Process Depth Of Field
[GPU Gems3] Chapter 28. Practical Post Process Depth Of Field[GPU Gems3] Chapter 28. Practical Post Process Depth Of Field
[GPU Gems3] Chapter 28. Practical Post Process Depth Of Field
 

IndirectDraw with unity

  • 2. Unity 렌더링 구조 로직 유저가 만든 렌더링 커맨드들 MeshRender, Graphics.Draw, 등등~ CommandBuffer 생성 렌더 파이프 현재 환경과 설정된 렌더 파이프에 맞추어 실제 실행할 렌더커맨드 생성 LWRP, HDRP, Built-in Legacy RenderCommandB uffer 생성 렌더 Context 렌더커맨드를 API 명령어로 호출 RenderingComma ndBuffer 실행 실제 그래픽 API 함수 호출 Graphic API DirectX, openGL 드라이버를 통해 GPU에 실제그리기 메인 스레드( C# ) 렌더 스레드( C++ )
  • 3. 렌더파이프의 역활 유저가 그린 오브젝트들 CommandBuffer 월드 정보들 ( 카메라 정보, 라이팅 정보) 렌더 환경 정보들 ( 모션벡터, 후처리, API 정보) 랜더파이프 ● Culling ● Sorting ● Data Updating ● Environment Setting ● Etc…. RanderCommand Buffer 생성
  • 4. 렌더 스레드 역할 https://unity3d.com/kr/learn/tutorials/topics/best-practices/multithreaded-rendering-graphics-jobs#Graphics%20Jobs 현재 Main + Render thread 형식이 기본 로우 레벨API ( Vulkan / DX12 ) 는 Main thread 아닌곳에서도RCMD 생성 가능 SRP는 렌더쓰레드가현재 강제? ( 초기버전은 꺼졌는데 현재 5.2.3버전 안꺼짐 )
  • 5. Unity 로직에서 커맨드 만드는 방법들 1. Renderer 컴포넌트 사용 ( MeshRenderer, SkinnedMeshRenderer ) 2. 코드에서 직접 그리기 ( Graphics.Draw 명령어들 DrawMesh ) 3. Graphics API 로 그리기 • 카메라 GameObject에 붙힌 컴포넌트의 특정 함수에서만 동작 OnPostRender, OnPreRender • OpenGL을 랩핑한 UnityEngine.GL 을 명령어 사용 • SRP에서 사용불가
  • 6. Renderer = Graphics.Draw Renderer는 Inspector일뿐, 결국 Graphics.Draw 와 똑같이 CommandBuffer생성 CommandBuffer
  • 7. Normal, Instancing, Indirect Draw의 다른점 렌더링의 시작인 VertexShader 까지 언제 어떻게 데이타를 넘기냐의 차이 Vertex Shader 그리기 위한 정보들
  • 8. Normal Draw Call Vertex Shader 버텍스 버퍼 인덱스 버퍼 버텍스 정보 SetTransform 머터리얼 정보 유니폼 데이터 ( 모든 쉐이더가 같이 공유하는 데이터 ) CPU GPU SetIB SetVB Draw
  • 9. Instancing Draw Call Vertex Shader 버텍스 버퍼 인덱스 버퍼 버텍스 정보 SetTransformList 머터리얼 정보 유니폼 데이터 SetIB SetVB 인스터스 ID리스트 ID 인스턴스 마다 다른 Transform DrawInstancing
  • 10. Indirect Draw 는 두 단계이다. Indirect는 그릴때 데이터를 보내지 않는다. 그리기 명령어와 데이터를 GPU에 보내는 것이 분리된다. 1단계 - 데이터 올리기 2단계 - 그리기 옵션 - 필요하면 데이터 Update하기 ( compute shader )
  • 11. Instancing Draw Call - Data 올리기 Compute Shader 그리기 위한 모든 정보 컴퓨트 버퍼 ( 일정간격마다 유니폼 데이터 ) 버퍼 상태 업데이트 ( ex: 컬링여부, 데이타 업데이트 ) Dispatch(optional) 유니폼 데이터 SetIBList SetVBList 인덱스 버퍼들 버텍스 버퍼들
  • 12. Instancing Draw Call - 2단계 그리기 Vertex Shader 컴퓨트 버퍼 ( 일정간격마다 유니폼 데이터 ) DrawIndirect 유니폼 데이터 인덱스 버퍼들 버텍스 버퍼들 유니폼 데이터 인덱스 버퍼 버텍스 버퍼 컴퓨트 버퍼의 일정간격 마다(Stride) 하나의 Draw Call 이 된다.
  • 13. Draw VS DrawInstance VS DrawIndirect 동일 shader로 10개 Material을 만들고 10개 Mesh를 이용해 10x10 = 100종의 오브젝트를 만든다 오브젝트를 100개씩 그린다. ( 1 x 10 x 10 x 100 = 10000 개의 인스턴스 ) for( material ){ for( texture ){ for ( mesh ){ for ( Instance ){ SetUniformData() Draw(); }}}} Once 10 = 10 setTexture Per Frame 10x10x100 = 10000 SetData 10x10x100 = 10000 draw call for( material ){ for( texture ){ for ( mesh ){ SetUniformDataList() InstancingDraw(); }}} Once 10 = 10 setTexture Per frame 10x10 = 100 SetData 10x10 = 100 draw call for( shader ){ if( needUpdateBuffer ) UpdateBuffer(); IndirectDraw(); } Once 10 = 10 setTexture 1 = 1 SetData Per frame 1 = 1 draw call
  • 14. Indirect Draw 사용법 Indirect Draw는 아직은 직접 명령어로만 가능 ( 아마 앞으로도.. ) DX11에 상응하는 API 필요 ( ES3.1, METAL, VULKAN ) 실질적으로 엔진 렌더파이프라인을 건너 뜀 ( culling, sorting, updating X ) 직접 모든 데이타를 compute shader를 이용해서 관리해야함
  • 15. Indirect Draw 사용법 실제코드는 굉장히 간단, 5분이면 테스트 가능 ( 데이터 올리고 그리는 10줄, 쉐이더에 10줄 추가로 끝~ ) 예제: https://docs.unity3d.com/2019.1/Documentation/ScriptReference/Graphics.Draw MeshInstancedIndirect.html
  • 16. Indirect Draw 실제 사용 기존 쉐이더마다 Indirect용으로 컨버팅하기 번거로워 유니티에서 실용적인 Indirect 쉐이더 디자인패턴을 제공 #pragma instancing_options procedural:FunctionName 옵션을 이용해서 인스턴스마다 유니폼버퍼들을 재설정하는 방식의 코드를 추가하고 이전쉐이더 상태 그대로 사용하는 것이 보통임 이전쉐이더에 위의 전처리 한줄만 추가하면 됨 ( 유니티 짱! )
  • 17. Indirect Draw 실제 사용 인스턴스마다의 정보를 업데이트 한다. void IndirectSetupInstance() { #ifdef UNITY_PROCEDURAL_INSTANCING_ENABLED // 인스턴스에 맞는 global 변수 업데이트 // unity_ObjectToWorld,unity_WorldToObject,그 외 버퍼들 #endif } #pragma instancing_options procedural:IndirectSetupInstance