Top Banner
Shader Driven In-House 개개개 개개 Shader 개개 개개개
31

Shader Driven

May 06, 2015

Download

Documents

Changhee Lee
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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