shader driven

31
Shader Driven In-House 개개개 개개 Shader 개개 개개개

Upload: changhee-lee

Post on 06-May-2015

1.398 views

Category:

Documents


8 download

TRANSCRIPT

Page 1: Shader Driven

Shader DrivenIn-House 개발을 위한 Shader 통합

이창희

Page 3: Shader Driven

Shader-DrivenShader-Driven?

Game Engine 에서 Shader 를 사용하여 , Rendering을 처리하는 것이 일반화 됨 .

그렇다면 , 과연 Shader 를 사용하여 Rendering 을 효과적으로 처리하는 방법들에 대해서도 한번 고민해봐야 하지 않을까 ?

Page 4: Shader Driven

Shader-Driven(Cont’)Data-Driven 과 비교해보면…

Shader 의 변경만으로 다양한 효과를 낼 수 있으면 좋겠다 .C++ 의 코드를 수정하지 않고…

Page 5: Shader Driven

Contents In-House Renderer 의 개발 사례를 기반으로

Shader-Driven 을 되돌아보자 .

• Shader Variable Binding• Shader/Material System• Shader Generator (UberShader/Material Editor)• Post-Processing• 후기

Page 6: Shader Driven

Shader Variable Binding처음 Shader 를 작업한다면 ,

Shader Code 작성 ->Shader 의 Variable 들을 C++ Code 에서 설정해준다 .

C++ Logic

ShaderLogic

만약 , 이런 식으로 계속적인 작업을 한다면…Shader 에 변수들을 추가할 때마다 ,

매번 C++ Code 를 수정함 .

Page 7: Shader Driven

Shader Code 의 Shader Vari-able 과 C++ Code 의 연결을 자동으로 할 수는 없을까 ?

Page 8: Shader Driven

Shader Variable Binding(Cont’) Shader 를 이용하여 새로운 기능을 구현하기 위해

서 , C++ 과 완전히 독립적일 수는 없다 .• Normal-Map 기능 추가

(vertex 의 tangent (+binormal) 구현 필요 )• GPU Skinning 기능 추가

(vertex blend 정보 및 bone matrix 들 구현 필요 )

• …

하지만 , 같은 기술 레벨의 기능을 추가하는 것은 C++ 을 수정하지 않고도 충분히 가능하다 .• 또한 , 변경에 대한 추가비용을 줄일 수 있다 .

( 예 , DOF 의 장면 Depth)• C++ 과 완전 분리가 목표 . (Data-Driven)

Page 9: Shader Driven

Shader Variable Binding(Cont’)Effect (.fx) 파일은 소스 파일이 아닌 , Data 로

본다면 , C++ 과 Effect 파일이 분리될 수 있어야 한다• Shader 가 변경되어도 , 자동을 Shader Variables

와 C++ Code 를 연결할 수 있는 기능이 필요하다 . 상수는 외부에서 설정 가능 한 것들 (material 변수들 , texture 등

… ) 프로그램 내부에서 Bind 해줘야 하는 것 (matrix, 카메라

위치 등… )

Page 10: Shader Driven

사례Shader Variable 의 Sementic 이나 이름을 이용

정의된 Sementic 이라면 , C++ Code 에 Mapping!!!

Page 11: Shader Driven

ShaderShader 의 사용 용도를 크게 나누어 보면 ,1. Mesh 나 Effect 등에 재질을 표현하기 위해서 사용 .2. Post-Processing 등에 사용되는 후처리 효과를

표현하기 위해 사용 .3. …

1, 2 번에 대해서 조금 더 자세히…

Page 12: Shader Driven

Mesh

Shader-Material System 재질을 표현하는 Shader 를 조금 더 효과적으로

사용하기 위해서 , Shader 를 포함한 더 큰 의미의 Ma-terial 로 표현 .

Shader 기반의 Renderer 를 작성하기 위해서는 Ren-derer 의 기본이 되는 Shader(Material) System 이 필요하다 .

Material 의 구성 Texture, Color, RenderState, Shader 등…

Material

Shader

C++

Page 13: Shader Driven

사례Material 을 이용하여 , Shader 에 넣어주어야

Shader Variable 들에 값을 넣어주자 .

Page 14: Shader Driven

Shader 제작 현재 엔진에서 쉐이더를 작성하는 방법은 크게 3 가지

정도로 나눌 수 있는데 ,• Shader Code 를 작성 수작업으로 작성 .• Shader 작성 Tool 을 이용하여 작성 .

(FX composer, RenderMonkey, ShaderFX…)• Shader Editor (Material Editor) 을 구현하여 작성 .

프로그래머가 C++ 에 Shader 를 통합하는 방법이 경우에 따라서는 좋은 선택이 될 수도 있다 .• UberShader 가 괜찮은 해법이 될 수도

Page 15: Shader Driven

Uber Shader하나의 Shader 로 모든 기능 구현Super Shader 라고도 불림Shader 의 전처리기를 이용하여 , Shader 작성그래프 편집과 비교

몇 가지 기능 위주로 선택적으로 사용할 경우 , 그래프 편집보다 편리 아티스트의 셰이더 조합에 대한 스트레스 없이 기능을 적용 지속적인 기능 추가를 위해선 전담 셰이더 프로그래머가 필요 셰이더 종류가 한정적이이서 최적화에 유리

Material System 과 함께 이용하면 , Material Sys-tem 에서 설정된 값을 통하여 , Shader 의 다양한 조합을 설정할 수 있음 .

Page 16: Shader Driven

사례Material 에서 GlowMap 을 추가한다면 ,

Page 17: Shader Driven

툴과 연동On/Off 형태로 기능을 끄고 켤 수 있도록…Material + UberShader참고 영상 : http://

www.youtube.com/watch?v=utaMQFuwNHw&hl=ko

Page 18: Shader Driven

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

Page 19: Shader Driven

사례 Fragment(Node) 는 만들 수 있다 .

만든 노드를 순서대로 빌드하면 , Shader Code 를 뽑는 것도 어려운 일이 아니다 .

단 , Editor 를 만드는 것은 GG.

Page 20: Shader Driven

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

Page 21: Shader Driven

Post-ProcessingPost-Processing 의 패턴을 살펴보면 , 다음 과정을

반복1. RenderTarget 설정2. 1 번 타겟에 ScreenAlignedQuad 에 장면 랜더링

원하는 Shader 처리3. 이전 랜더링된 텍스쳐 ( 타겟 ) 을 이용하여 , 1 번과

2 번 작업을 반복 .4. FrameBuffer 에 최종 랜더타겟의 텍스쳐 출력

Page 22: Shader Driven

[ShaderX5. PostProcessing Effects in Design]

Page 23: Shader Driven

Post-Processing(Cont’)패턴화 된 형태를 C++ Code 에서 처리할 수

있도록 해주고 , xml 등의 외부에서 Post-Process-ing 에 대해서 규정한다면 , Data-Driven 형태로 , Post-Processing 을 Shader

와 xml 을 수정만으로도 처리가 가능 .

Post-Processing 기능들의 On/Off 에 대한 조합의 처리도 의외로 간단하게 처리할 수 있다 .각 기능들을 하나의 Node 와 같이 처리하자 !

Page 24: Shader Driven

사례

[Nebula3. frame/dx9default.xml]

Page 25: Shader Driven

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 의 변경을 줄일 수 있다 .

Page 26: Shader Driven

후기C++ 에서 Shader 와 연결하는 깔끔한

인터페이스를 만드는 것이 매우 어렵더라 Shader Logic 과 C++ Logic 에서 처리할 것들을

잘 구분하면 , 더 깔끔해질 수 있을 것 같다 . Shader 에서 처리하는 것이 그래도 , 좀 깔끔한 듯 .

추가되는 기능에 대해 동일한 인터페이스를 유지하는 것이 쉽지는 않다 .

어느 정도 Code 가 쌓이면 , xml 파일과 fx 파일을 이용해서 , 왠만한 새로운 Shader 의 추가 작업을 처리할 수 있더라 .Ex) NormalMap, SpecularMap 추가

Page 27: Shader Driven

In-House 랜더러를 개발한다면 , 자신에 상황이나 게임에 적합한 Shader 작업 방식에 대해서 한번 정도 고민해보자 !!!

Page 28: Shader Driven
Page 31: Shader Driven