3. Shader-Driven
Shader-Driven?
Game Engine에서 Shader를 사용하여, Rendering을 처리
하는 것이 일반화 됨.
그렇다면, 과연 Shader를 사용하여
Rendering을 효과적으로 처리하는 방법들
에 대해서도 한번 고민해봐야 하지 않을까?
5. Contents
In-House Renderer의 개발 사례를 기반으로 Shader-
Driven을 되돌아보자.
• Shader Variable Binding
• Shader/Material System
• Shader Generator (UberShader/Material Editor)
• Post-Processing
• 후기
6. Shader Variable Binding
처음 Shader를 작업한다면,
Shader Code 작성->Shader의 Variable들을 C++ Code
에서 설정해준다.
C++ Shader
Logic Logic
만약, 이런 식으로 계속적인 작업을 한다면…
Shader에 변수들을 추가할 때마다, 매번
C++ Code를 수정함.
8. Shader Variable Binding(Cont’)
Shader를 이용하여 새로운 기능을 구현하기 위해서,
C++과 완전히 독립적일 수는 없다.
• Normal-Map 기능 추가
(vertex의 tangent (+binormal) 구현 필요)
• GPU Skinning 기능 추가
(vertex blend 정보 및 bone matrix들 구현 필요)
• …
하지만, 같은 기술 레벨의 기능을 추가하는 것은 C++
을 수정하지 않고도 충분히 가능하다.
• 또한, 변경에 대한 추가비용을 줄일 수 있다.
(예, DOF의 장면Depth)
• C++과 완전 분리가 목표. (Data-Driven)
9. Shader Variable Binding(Cont’)
Effect (.fx) 파일은 소스 파일이 아닌, Data로 본다면,
C++과 Effect파일이 분리될 수 있어야 한다
• Shader가 변경되어도, 자동을 Shader Variables와 C++
Code를 연결할 수 있는 기능이 필요하다.
상수는
외부에서 설정 가능 한 것들(material 변수들, texture 등…)
프로그램 내부에서 Bind해줘야 하는 것(matrix, 카메라 위치 등
…)
11. Shader
Shader의 사용 용도를 크게 나누어 보면,
1. Mesh나 Effect등에 재질을 표현하기 위해서 사용.
2. Post-Processing등에 사용되는 후처리 효과를 표현
하기 위해 사용.
3. …
1, 2번에 대해서 조금 더 자세히…
12. Shader-Material System
재질을 표현하는 Shader를 조금 더 효과적으로 사용하기
위해서, Shader를 포함한 더 큰 의미의 Material로 표현.
Shader 기반의 Renderer를 작성하기 위해서는 Renderer
의 기본이 되는 Shader(Material) System이 필요하다.
Material의 구성
Texture, Color, RenderState, Shader 등…
Shader
Material
Mesh C++
14. Shader 제작
현재 엔진에서 쉐이더를 작성하는 방법은 크게 3가지 정
도로 나눌 수 있는데,
• Shader Code를 작성 수작업으로 작성.
• Shader 작성 Tool을 이용하여 작성.
(FX composer, RenderMonkey, ShaderFX…)
• Shader Editor (Material Editor)을 구현하여 작성.
프로그래머가 C++에 Shader를 통합하는 방법이 경우에
따라서는 좋은 선택이 될 수도 있다.
• UberShader가 괜찮은 해법이 될 수도
15. Uber Shader
하나의 Shader로 모든 기능 구현
Super Shader라고도 불림
Shader의 전처리기를 이용하여, Shader 작성
그래프 편집과 비교
몇 가지 기능 위주로 선택적으로 사용할 경우, 그래프 편집보다 편리
아티스트의 셰이더 조합에 대한 스트레스 없이 기능을 적용
지속적인 기능 추가를 위해선 전담 셰이더 프로그래머가 필요
셰이더 종류가 한정적이이서 최적화에 유리
Material System과 함께 이용하면, Material System에서
설정된 값을 통하여, Shader의 다양한 조합을 설정할 수
있음.
17. 툴과 연동
On/Off 형태로 기능을 끄고 켤 수 있도록…
Material + UberShader
참고 영상: http://www.youtube.com/watch?v=utaMQFuwNHw&hl=ko
18. Shader Editor
Shader Editor는 Kgc2008 에서 장언일님에 의해 소개
UE3의 Material Editor
Shader Editor를 사용해야만 하는가?
• http://realtimecollisiondetection.net/blog/?p=73
• http://diaryofagraphicsprogrammer.blogspot.com/2008/09/shader-
workflow-why-shader-generators.html
19. 사례
Fragment(Node)는 만들 수 있다.
만든 노드를 순서대로 빌드하면, Shader Code를 뽑는
것도 어려운 일이 아니다.
단, Editor를 만드는 것은 GG.
20. Post-Processing
Post-Processing
• Shader에 의존적이지만, 기반 시스템이 전혀 다르다.
• Material Editor 기반으로 Shader를 생성한다고 해도, Post-
Processing의 Shader에 대해서는 다른 방식이 필요할 것이
다.
• Post-Processing을 C++에서 구현하게 되면, 아마도 내부적
으로 비슷한 작업 방식을 가지는 지저분한 코드들이 반복적
으로 생성될 것이다.
• Post-Processing 작업을 C++코드와 독립시킬 수 있는 시스
템이 필요.
• ShaderX5권에 소개 된 Post-Process Effects In Design
• Nubula3의 frameShader
21. Post-Processing
Post-Processing의 패턴을 살펴보면, 다음 과정을 반
복
1. RenderTarget 설정
2. 1번 타겟에 ScreenAlignedQuad에 장면 랜더링
원하는 Shader 처리
3. 이전 랜더링된 텍스쳐(타겟)을 이용하여, 1번과 2번
작업을 반복.
4. FrameBuffer에 최종 랜더타겟의 텍스쳐 출력
23. Post-Processing(Cont’)
패턴화 된 형태를 C++ Code에서 처리할 수 있도록 해
주고, xml등의 외부에서 Post-Processing에 대해서 규
정한다면,
Data-Driven 형태로, Post-Processing을 Shader와 xml
을 수정만으로도 처리가 가능.
Post-Processing 기능들의 On/Off에 대한 조합의 처
리도 의외로 간단하게 처리할 수 있다.
각 기능들을 하나의 Node와 같이 처리하자!
25. Summary
• Shader Variable Binding
• Shader 변수의 Sementic을 이용한 C++과 연결.
• Shader/Material System
• Material(.xml)에 정의된 텍스쳐, 색상 정보등을 정해진
Shader 변수에 설정해준다.
• UberShader
• UberShader를 사용하여, Shader 조합의 폭발을 해결한
다. 특히, Material(.xml)과 함께 사용.
• Post-Processing
• Post-Processing의 작업 패턴을 이용하여, xml등에서
설정할 수 있도록 하면, C++ Code의 변경을 줄일 수 있
다.
26. 후기
C++에서 Shader와 연결하는 깔끔한 인터페이스를 만
드는 것이 매우 어렵더라
Shader Logic과 C++ Logic 에서 처리할 것들을 잘 구
분하면, 더 깔끔해질 수 있을 것 같다.
Shader에서 처리하는 것이 그래도, 좀 깔끔한 듯.
추가되는 기능에 대해 동일한 인터페이스를 유지하는
것이 쉽지는 않다.
어느 정도 Code가 쌓이면, xml파일과 fx파일을 이용
해서, 왠만한 새로운 Shader의 추가 작업을 처리할 수
있더라.
Ex) NormalMap, SpecularMap 추가