shader compilation
DESCRIPTION
kasastudyTRANSCRIPT
Agenda
• Shader – HLSL / GLSL
• Shader Build – Shader Graph
– Uber Shader
• Mobile Shader
• Shader Compilation
Shader • 렌더링 파이프라인을 직접 프로그래밍할 수 있다!
• 고정 파이프라인 / 프로그래머블 파이프라인
• HLSL – DirectX에서 사용하는 고수준 셰이더 언어 – Shader Model 버전별로 스펙이 다름 – DirectX11.2 / SM 5.0 최신
• GLSL – OpenGL에서 사용하는 고수준 셰이더 언어 – OpenGL / OpenGL ES 버전 별로 스펙이 다름
Shader Build
• 초창기 셰이더는 프로그래머가 셰이더 코드를 작성
• 어셈 셰이더
• 고수준 셰이더 언어 (cg, hlsl, glsl, …)
• But, 셰이더의 응용 범위가 늘어나면서, 복잡도가 높아짐
Shader Explosion
• 셰이더 조합의 폭발! • Static or Skinned Model
• +Lighting (or No Light)
• +Shadow (or No Shadow)
• +Cartoon (or No Cartoon)
• +Etc..
• 추가할 때마다 조합의 경우의 수가 제곱으로 폭발!!!
Shader Explosion
• 포스트 프로세싱의 발전
• 유저의 PC 사양의 다양화
• 셰이더의 표현 가능한 스펙트럼이 넓어짐
• 유저의 PC 환경이나 게임의 그래픽 타겟에 맞게 유연하게 셰이더가 연동되어야 함
• “다양한 기능 + 다양한 환경”
• 모든 경우의 수를 코딩해야 한다면!!!
Shader Explosion Solution
• 조합형 셰이더
– 독립된 단일 기능에 대한 셰이더 코드 유닛을 작성
– 셰이더 코드 유닛을 조합해서 셰이더 코드 완성
• Uber 셰이더
– 전체적으로 모든 기능의 셰이더 코드를 작성하고 필요한 기능만 On/Off 해서 필요한 기능만 사용
[UDK : DefaultVertexShader.msf]
Shader Editing • 셰이더가 프로그래밍을 해야 하는 과정이지
만, 최종 결과는 아티스트 영역 • 아티스트들이 좀 더 셰이더를 다양하고 손쉽
게 다루고자 하는 Needs가 생김 • 1. 셰이더를 배운다. • 2. 비주얼 프로그래머에게 친한 척 한다. • 3. 비주얼 프로그래머를 툴을 만들어 달라고 협박(?) 한
다.
• 결국 Iteration의 문제!
Shader Editor
• Shader Explosion / Shader Editing을 해결할 수 있는 방법이 없을까?
• 나름의 방식으로 “Shader Editor”가 발전 • 전통적인 방식의 “Shader Graph Editor”
• 변칙적인 방식의 “Uber Shader Editor”
Shader Graph Editor
Uber Shader Editor
Cross Platform • 모바일 게임 시대에 도래! • PC / Mobile 을 동시에 지원하는 것이 중요해
짐 • OpenGL ES의 중요성이 높아짐! • 즉, HLSL기반에서 GLSL기반으로 포팅이 필요
해짐! • 일반적으로 기존에 PC용 엔진 기반을 모바일
엔진으로 포팅
UE3의 사례 • 초창기에는 엔진과 별도로 OpenGL ES 렌더러 포
팅을 진행
• 기존 셰이더 기반은 유닛 셰이더 조합 기반이었으나, 모바일에서는 UberShader 방식을 사용
• 모바일 셰이더를 수작업으로 별도로 만듦
• 하지만, Editor는 같음
• 따라서, 별도의 모바일 작업 룰이 발생하고, 미묘하게 공식도 달라짐
Cross Platform
• 셰이더를 새로 구현하거나 변경했을 경우, 포팅 및 관리가 어려워짐 – 셰이더 파일 자체의 파편화!
• 실행해보기 전에는 잘 돌아가는지 알 수가 없음!
• 같은 GLSL이라고 해도 플랫폼 별로 최적화 이슈를 처리해야 할 필요도 생김
• 모든 경우의 수를 코딩해야 한다면!!!
요구사항들.
• 셰이더를 하나로 관리하고 싶음
• 에디터에서도 동일하게 사용하고 싶음
• 실행하기 전에 오류를 확인하고 싶음
Shader Compilation
• 시작은 유니티에서 먼저 시작
• Unity 3.0을 작업하면서 저 문제를 해결해보고 싶었음
• 기존 PC 엔진에 모바일 포팅하는 것이 아니라 완전히 새로운 구성이 필요해짐
• HLSL2GLSL
• glsl-optimizer
HLSL to GLSL Translator
• 유니티 개발팀 Aras Pranckevičius 님이 주도
• ATI에서 HLSL2GLSL이라는 예전 프로젝트로 출발! Hlsl2glslfork 라이브러리화
• http://code.google.com/p/hlsl2glslfork/
GLSL Optimizer
• 변환은 성공하였으나, 모바일 환경에서는 매우 느림. GLSL최적화 필요!
• 우연히 Mesa3D 라이브러리에서 새로운 컴파일러를 만들고 있다는 것을 알게 됨.
• 참고해서 GLSL최적화 처리를 시도 glsl-optimizer를 만듦
• http://github.com/aras-p/glsl-optimizer
UE4
• 같은 방식과 기반을 사용
• 전처리기만 mcpp로 사용
• hlslcc 라는 셰이더 Cross Compile 라이브러리를 개발
Metal API • IOS8에서 선보이는 새로운 랜더링 API
• Metal Programming Guide
• Metal Shading Language • Metal Shading Language Guide • “clang과 LLVM을 사용한다”
• Unreal에서는 ShaderCompileWorker를 업데이트 받으면 적용된다고 발표!
• 셰이더 컴파일러가 내부적으로 컴파일 해주겠..
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
Conclusion • 이제 프로그래머가 드라이버에 맞춰서 셰이
더 최적화 하는 시대가 아니다! • 그래도 아티스트의 최적화가 가장 중요!
• (개발 관점에서) 엔진에서 가장 중심에 있는 부
분이라고 생각. • 이 중심을 기반으로 데이터 구조와 렌더링 프로세스가 구성 • 관심 있게 보면 시대의 흐름이 보임
참고자료 • 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