Shader Driven

1,819 views

Published on

0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,819
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
23
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

Shader Driven

  1. 1. In-House 개발을 위한 Shader 통합 이창희
  2. 2. Self-Introduction •現 CCR 엔진팀장 E-mail: cagetu79@gmail.com Blog: cagetu@egloos.com
  3. 3. Shader-Driven Shader-Driven? Game Engine에서 Shader를 사용하여, Rendering을 처리 하는 것이 일반화 됨. 그렇다면, 과연 Shader를 사용하여 Rendering을 효과적으로 처리하는 방법들 에 대해서도 한번 고민해봐야 하지 않을까?
  4. 4. Shader-Driven(Cont’) Data-Driven과 비교해보면… Shader의 변경만으로 다양한 효과를 낼 수 있으면 좋겠다.  C++의 코드를 수정하지 않고…
  5. 5. Contents In-House Renderer의 개발 사례를 기반으로 Shader- Driven을 되돌아보자. • Shader Variable Binding • Shader/Material System • Shader Generator (UberShader/Material Editor) • Post-Processing • 후기
  6. 6. Shader Variable Binding 처음 Shader를 작업한다면,  Shader Code 작성->Shader의 Variable들을 C++ Code 에서 설정해준다. C++ Shader Logic Logic 만약, 이런 식으로 계속적인 작업을 한다면…  Shader에 변수들을 추가할 때마다, 매번 C++ Code를 수정함.
  7. 7. Shader Code의 Shader Variable과 C++ Code의 연결을 자동으로 할 수는 없을까?
  8. 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. 9. Shader Variable Binding(Cont’) Effect (.fx) 파일은 소스 파일이 아닌, Data로 본다면, C++과 Effect파일이 분리될 수 있어야 한다 • Shader가 변경되어도, 자동을 Shader Variables와 C++ Code를 연결할 수 있는 기능이 필요하다.  상수는  외부에서 설정 가능 한 것들(material 변수들, texture 등…)  프로그램 내부에서 Bind해줘야 하는 것(matrix, 카메라 위치 등 …)
  10. 10. 사례 Shader Variable의 Sementic이나 이름을 이용  정의된 Sementic이라면, C++ Code에 Mapping!!!
  11. 11. Shader Shader의 사용 용도를 크게 나누어 보면,1. Mesh나 Effect등에 재질을 표현하기 위해서 사용.2. Post-Processing등에 사용되는 후처리 효과를 표현 하기 위해 사용.3. … 1, 2번에 대해서 조금 더 자세히…
  12. 12. Shader-Material System 재질을 표현하는 Shader를 조금 더 효과적으로 사용하기 위해서, Shader를 포함한 더 큰 의미의 Material로 표현. Shader 기반의 Renderer를 작성하기 위해서는 Renderer 의 기본이 되는 Shader(Material) System이 필요하다. Material의 구성  Texture, Color, RenderState, Shader 등… Shader Material Mesh C++
  13. 13. 사례 Material을 이용하여, Shader에 넣어주어야 Shader Variable들에 값을 넣어주자.
  14. 14. Shader 제작 현재 엔진에서 쉐이더를 작성하는 방법은 크게 3가지 정 도로 나눌 수 있는데, • Shader Code를 작성 수작업으로 작성. • Shader 작성 Tool을 이용하여 작성. (FX composer, RenderMonkey, ShaderFX…) • Shader Editor (Material Editor)을 구현하여 작성. 프로그래머가 C++에 Shader를 통합하는 방법이 경우에 따라서는 좋은 선택이 될 수도 있다. • UberShader가 괜찮은 해법이 될 수도
  15. 15. Uber Shader 하나의 Shader로 모든 기능 구현 Super Shader라고도 불림 Shader의 전처리기를 이용하여, Shader 작성 그래프 편집과 비교  몇 가지 기능 위주로 선택적으로 사용할 경우, 그래프 편집보다 편리  아티스트의 셰이더 조합에 대한 스트레스 없이 기능을 적용  지속적인 기능 추가를 위해선 전담 셰이더 프로그래머가 필요  셰이더 종류가 한정적이이서 최적화에 유리 Material System과 함께 이용하면, Material System에서 설정된 값을 통하여, Shader의 다양한 조합을 설정할 수 있음.
  16. 16. 사례 Material에서 GlowMap을 추가한다면,
  17. 17. 툴과 연동 On/Off 형태로 기능을 끄고 켤 수 있도록… Material + UberShader 참고 영상: http://www.youtube.com/watch?v=utaMQFuwNHw&hl=ko
  18. 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. 19. 사례 Fragment(Node)는 만들 수 있다.  만든 노드를 순서대로 빌드하면, Shader Code를 뽑는 것도 어려운 일이 아니다.  단, Editor를 만드는 것은 GG.
  20. 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. 21. Post-Processing Post-Processing의 패턴을 살펴보면, 다음 과정을 반 복1. RenderTarget 설정2. 1번 타겟에 ScreenAlignedQuad에 장면 랜더링  원하는 Shader 처리3. 이전 랜더링된 텍스쳐(타겟)을 이용하여, 1번과 2번 작업을 반복.4. FrameBuffer에 최종 랜더타겟의 텍스쳐 출력
  22. 22. [ShaderX5. PostProcessing Effects in Design]
  23. 23. Post-Processing(Cont’) 패턴화 된 형태를 C++ Code에서 처리할 수 있도록 해 주고, xml등의 외부에서 Post-Processing에 대해서 규 정한다면,  Data-Driven 형태로, Post-Processing을 Shader와 xml 을 수정만으로도 처리가 가능. Post-Processing 기능들의 On/Off에 대한 조합의 처 리도 의외로 간단하게 처리할 수 있다.  각 기능들을 하나의 Node와 같이 처리하자!
  24. 24. 사례 [Nebula3. frame/dx9default.xml]
  25. 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. 26. 후기 C++에서 Shader와 연결하는 깔끔한 인터페이스를 만 드는 것이 매우 어렵더라  Shader Logic과 C++ Logic 에서 처리할 것들을 잘 구 분하면, 더 깔끔해질 수 있을 것 같다.  Shader에서 처리하는 것이 그래도, 좀 깔끔한 듯.  추가되는 기능에 대해 동일한 인터페이스를 유지하는 것이 쉽지는 않다. 어느 정도 Code가 쌓이면, xml파일과 fx파일을 이용 해서, 왠만한 새로운 Shader의 추가 작업을 처리할 수 있더라.  Ex) NormalMap, SpecularMap 추가
  27. 27. In-House 랜더러를 개발한다면, 자신에 상황이나 게임에 적합 한 Shader작업 방식에 대해서 한번 정도 고민해보자!!!
  28. 28.  A/S 문의  http://cagetu.egloos.com/5091227
  29. 29. Reference Shaders and Metaprogramming  http://www.gamedev.net/reference/programming/features/sh adermet/• Shader & Material System • http://www.gamedev.net/community/forums/topic.asp?topic _id=169710&PageSize=25&WhichPage=1 • http://www.gamedev.net/community/forums/topic.asp?topic _id=345563• Visual Editor  http://gamecode.org/tt/entry/visualshadereditor Nebula3  http://flohofwoe.blogspot.com/

×