Shader Compilation
이창희(cagetu79@gmail.com)
@cagetu
#kasastudy
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

Shader compilation

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