shader compilation

28
Shader Compilation 이창희([email protected]) @cagetu #kasastudy

Upload: changhee-lee

Post on 06-May-2015

1.121 views

Category:

Engineering


9 download

DESCRIPTION

kasastudy

TRANSCRIPT

Page 1: Shader compilation

Shader Compilation

이창희([email protected]) @cagetu

#kasastudy

Page 2: Shader compilation

Agenda

• Shader – HLSL / GLSL

• Shader Build – Shader Graph

– Uber Shader

• Mobile Shader

• Shader Compilation

Page 3: Shader compilation

Shader • 렌더링 파이프라인을 직접 프로그래밍할 수 있다!

• 고정 파이프라인 / 프로그래머블 파이프라인

• HLSL – DirectX에서 사용하는 고수준 셰이더 언어 – Shader Model 버전별로 스펙이 다름 – DirectX11.2 / SM 5.0 최신

• GLSL – OpenGL에서 사용하는 고수준 셰이더 언어 – OpenGL / OpenGL ES 버전 별로 스펙이 다름

Page 4: Shader compilation

Shader Build

• 초창기 셰이더는 프로그래머가 셰이더 코드를 작성

• 어셈 셰이더

• 고수준 셰이더 언어 (cg, hlsl, glsl, …)

• But, 셰이더의 응용 범위가 늘어나면서, 복잡도가 높아짐

Page 5: Shader compilation

Shader Explosion

• 셰이더 조합의 폭발! • Static or Skinned Model

• +Lighting (or No Light)

• +Shadow (or No Shadow)

• +Cartoon (or No Cartoon)

• +Etc..

• 추가할 때마다 조합의 경우의 수가 제곱으로 폭발!!!

Page 6: Shader compilation

Shader Explosion

• 포스트 프로세싱의 발전

• 유저의 PC 사양의 다양화

• 셰이더의 표현 가능한 스펙트럼이 넓어짐

• 유저의 PC 환경이나 게임의 그래픽 타겟에 맞게 유연하게 셰이더가 연동되어야 함

• “다양한 기능 + 다양한 환경”

Page 7: Shader compilation

• 모든 경우의 수를 코딩해야 한다면!!!

Page 8: Shader compilation

Shader Explosion Solution

• 조합형 셰이더

– 독립된 단일 기능에 대한 셰이더 코드 유닛을 작성

– 셰이더 코드 유닛을 조합해서 셰이더 코드 완성

• Uber 셰이더

– 전체적으로 모든 기능의 셰이더 코드를 작성하고 필요한 기능만 On/Off 해서 필요한 기능만 사용

Page 9: Shader compilation

[UDK : DefaultVertexShader.msf]

Page 10: Shader compilation

Shader Editing • 셰이더가 프로그래밍을 해야 하는 과정이지

만, 최종 결과는 아티스트 영역 • 아티스트들이 좀 더 셰이더를 다양하고 손쉽

게 다루고자 하는 Needs가 생김 • 1. 셰이더를 배운다. • 2. 비주얼 프로그래머에게 친한 척 한다. • 3. 비주얼 프로그래머를 툴을 만들어 달라고 협박(?) 한

다.

• 결국 Iteration의 문제!

Page 11: Shader compilation

Shader Editor

• Shader Explosion / Shader Editing을 해결할 수 있는 방법이 없을까?

• 나름의 방식으로 “Shader Editor”가 발전 • 전통적인 방식의 “Shader Graph Editor”

• 변칙적인 방식의 “Uber Shader Editor”

Page 12: Shader compilation

Shader Graph Editor

Page 13: Shader compilation

Uber Shader Editor

Page 14: Shader compilation

Cross Platform • 모바일 게임 시대에 도래! • PC / Mobile 을 동시에 지원하는 것이 중요해

짐 • OpenGL ES의 중요성이 높아짐! • 즉, HLSL기반에서 GLSL기반으로 포팅이 필요

해짐! • 일반적으로 기존에 PC용 엔진 기반을 모바일

엔진으로 포팅

Page 15: Shader compilation

UE3의 사례 • 초창기에는 엔진과 별도로 OpenGL ES 렌더러 포

팅을 진행

• 기존 셰이더 기반은 유닛 셰이더 조합 기반이었으나, 모바일에서는 UberShader 방식을 사용

• 모바일 셰이더를 수작업으로 별도로 만듦

• 하지만, Editor는 같음

• 따라서, 별도의 모바일 작업 룰이 발생하고, 미묘하게 공식도 달라짐

Page 16: Shader compilation

Cross Platform

• 셰이더를 새로 구현하거나 변경했을 경우, 포팅 및 관리가 어려워짐 – 셰이더 파일 자체의 파편화!

• 실행해보기 전에는 잘 돌아가는지 알 수가 없음!

• 같은 GLSL이라고 해도 플랫폼 별로 최적화 이슈를 처리해야 할 필요도 생김

Page 17: Shader compilation

• 모든 경우의 수를 코딩해야 한다면!!!

Page 18: Shader compilation

요구사항들.

• 셰이더를 하나로 관리하고 싶음

• 에디터에서도 동일하게 사용하고 싶음

• 실행하기 전에 오류를 확인하고 싶음

Page 19: Shader compilation

Shader Compilation

• 시작은 유니티에서 먼저 시작

• Unity 3.0을 작업하면서 저 문제를 해결해보고 싶었음

• 기존 PC 엔진에 모바일 포팅하는 것이 아니라 완전히 새로운 구성이 필요해짐

• HLSL2GLSL

• glsl-optimizer

Page 21: Shader compilation

GLSL Optimizer

• 변환은 성공하였으나, 모바일 환경에서는 매우 느림. GLSL최적화 필요!

• 우연히 Mesa3D 라이브러리에서 새로운 컴파일러를 만들고 있다는 것을 알게 됨.

• 참고해서 GLSL최적화 처리를 시도 glsl-optimizer를 만듦

• http://github.com/aras-p/glsl-optimizer

Page 22: Shader compilation
Page 23: Shader compilation

UE4

• 같은 방식과 기반을 사용

• 전처리기만 mcpp로 사용

• hlslcc 라는 셰이더 Cross Compile 라이브러리를 개발

Page 24: Shader compilation
Page 26: Shader compilation

Conclusion • 이거슨 게임 엔진에서 셰이더 시스템의 변천사

1. Shader Writing – Shader Explsion / Shader Editing Issue

2. Shader Generation / Uber Shader

3. Shader Editor – Graph Editor / Uber Shader

4. Cross Platform Issue – 셰이더 파편화

5. Shader Compilation – Compile / Optimize / Cache

Page 27: Shader compilation

Conclusion • 이제 프로그래머가 드라이버에 맞춰서 셰이

더 최적화 하는 시대가 아니다! • 그래도 아티스트의 최적화가 가장 중요!

• (개발 관점에서) 엔진에서 가장 중심에 있는 부

분이라고 생각. • 이 중심을 기반으로 데이터 구조와 렌더링 프로세스가 구성 • 관심 있게 보면 시대의 흐름이 보임

Page 28: Shader compilation

참고자료 • http://blogs.unity3d.com/2010/10/20/shader-

compilation-for-multiple-platforms/ • http://aras-p.info/blog/2010/09/29/glsl-optimizer/ • http://www.slideshare.net/cagetu/gdc-14-bringing-

unreal-engine-4-to-opengl • http://www.slideshare.net/cagetu/mobile-

crossplatformchallenges-siggraph-15528000?related=1&utm_campaign=related&utm_medium=1&utm_source=2