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 환경이나 게임의 그래픽 타겟
에 맞게 유연하게 셰이더가 연동되어야 함
• “다양한 기능 + 다양한 환경”
Shader Explosion Solution
•조합형 셰이더
– 독립된 단일 기능에 대한 셰이더 코드 유닛을 작
성
– 셰이더 코드 유닛을 조합해서 셰이더 코드 완성
• Uber 셰이더
– 전체적으로 모든 기능의 셰이더 코드를 작성하고
필요한 기능만 On/Off 해서 필요한 기능만 사용
Shader Editing
• 셰이더가프로그래밍을 해야 하는 과정이지
만, 최종 결과는 아티스트 영역
• 아티스트들이 좀 더 셰이더를 다양하고 손쉽
게 다루고자 하는 Needs가 생김
• 1. 셰이더를 배운다.
• 2. 비주얼 프로그래머에게 친한 척 한다.
• 3. 비주얼 프로그래머를 툴을 만들어 달라고 협박(?) 한
다.
• 결국 Iteration의 문제!
11.
Shader Editor
• ShaderExplosion / Shader Editing을 해결
할 수 있는 방법이 없을까?
• 나름의 방식으로 “Shader Editor”가 발전
• 전통적인 방식의 “Shader Graph Editor”
• 변칙적인 방식의 “Uber Shader Editor”
Cross Platform
• 모바일게임 시대에 도래!
• PC / Mobile 을 동시에 지원하는 것이 중요해
짐
• OpenGL ES의 중요성이 높아짐!
• 즉, HLSL기반에서 GLSL기반으로 포팅이 필요
해짐!
• 일반적으로 기존에 PC용 엔진 기반을 모바일
엔진으로 포팅
15.
UE3의 사례
• 초창기에는엔진과 별도로 OpenGL ES 렌더러 포
팅을 진행
• 기존 셰이더 기반은 유닛 셰이더 조합 기반이었으
나, 모바일에서는 UberShader 방식을 사용
• 모바일 셰이더를 수작업으로 별도로 만듦
• 하지만, Editor는 같음
• 따라서, 별도의 모바일 작업 룰이 발생하고, 미묘
하게 공식도 달라짐
16.
Cross Platform
• 셰이더를새로 구현하거나 변경했을 경우,
포팅 및 관리가 어려워짐
– 셰이더 파일 자체의 파편화!
• 실행해보기 전에는 잘 돌아가는지 알 수가
없음!
• 같은 GLSL이라고 해도 플랫폼 별로 최적
화 이슈를 처리해야 할 필요도 생김
요구사항들.
• 셰이더를 하나로관리하고 싶음
• 에디터에서도 동일하게 사용하고 싶음
• 실행하기 전에 오류를 확인하고 싶음
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를 업데
이트 받으면 적용된다고 발표!
• 셰이더 컴파일러가 내부적으로 컴파일 해주겠..
Conclusion
• 이제 프로그래머가드라이버에 맞춰서 셰이
더 최적화 하는 시대가 아니다!
• 그래도 아티스트의 최적화가 가장 중요!
• (개발 관점에서) 엔진에서 가장 중심에 있는 부
분이라고 생각.
• 이 중심을 기반으로 데이터 구조와 렌더링 프로세스가 구성
• 관심 있게 보면 시대의 흐름이 보임