1. 아티스트에게 사랑받는
3DS MAX 우버 셰이더
Pope Kim
Rendering Engineer, EA Sports FIFA
Korea Game Conference 2013
2. 이유가 불분명한 난이도 조절용 설문조사
• 프로그래머 vs 아티스트 vs 테크니컬 아티스트?
• 현업개발자 vs 지망생?
• 셰이더가 뭔지 아시는 분 vs 모르시는 분?
• 우버 셰이더(uber shader)가 뭔지 아시는 분 vs 모르는 분?
3. 발표자 소개 - 현재
• EA 스포츠 FIFA 팀, 렌더링 엔지니어 (PS4, Xbox One)
• 서강대 게임개발 교육원 초빙교수
• 컨퍼런스 발표: 시그래프 2012, KGC 2011/2012/2013
• 저자
• 셰이더 프로그래밍 입문 (한빛미디어): 현재 영문판 집필중
• (게임개발자가 대우받는) 북미취업 가이드 (연두미디어)
• 감수자
• HLSL Shader Cookbook (영문, Packt Pub)
• 게임 매니악스 – 슈팅 게임 알고리즘 (한빛미디어)
4. 발표자 소개 - 과거
• 첫 게임개발시작: 1993년 정도
• 중간 외도 기간: 6년 (연세대 법학과 졸업 및 고시준비 -_-;;)
• 최근 회사들: 아이도스/스퀘어 에닉스 몬트리올, 렐릭/세가/THQ, 캡콤 밴쿠버
• 과거 개발한 플랫폼들: Xbox 360, PS3, PS2, PSP, Wii, PC
• 캐나다 AI대학 셰이더 프로그래밍 선생질: 3년 (part-time)
5. 발표자 소개 - 기타
• 마이크로소프트 Visual C++ MVP
• 게임개발 포에버 얼굴마담 (www.gamedevforever.com)
• 포프TV(www.youtube.com/user/KimPopeTV), 블로그(kblog.popekim.com),
• 트위터 @BlindRendererKR (한국어) @BlindRenderer (영어)
• 올해는 꽃미남 드립 생략 -_-;;;
• 출시한 게임수: 많음…
7. 오늘의 발표
• KGC 2011/ 2012 보단 덜 기술적
• Uber Shader는 이미 잘 알려진 것
• 하지만 프로그래머와 아티스트에게 모두 나름 문제있던 기법
• 2008년에 스페이스마린 프로젝트(Relic)에서 그 문제를 해결한 방법 소개
• 주로 아티스트의 효율성을 높이는 방법 (이유: 아티스트 시간이 제작비의 대부분)
• 아티스트들이 보고 프로그래머에게 “이거 해주세요~” 라고 하길…
8. 셰이더란?
• HLSL 셰이더 프로그래밍 입문: (당연 제 책 광고)
“셰이더란 화면에 출력할 픽셀의 위치와 색상을 계산하는 함수”
• Ndoors의 테크니컬 아티스트 디렉터 정종필 부장님:
“셰이더는 재질(때깔)이다”
9. 게임만드려면 셰이더가 몇개나?
• 갈팡질팡
• 그래픽 프로그래머 / 아티스트 중에 목소리 높은 팀 맘대로 일지도… -_-;;;
• 아니면 그냥 남이 하는게 더 멋져 보여서… -_-;;;
• 3가지 예
• 아트마다 하나씩
• 대충 종류별로 하나씩
• 그리고 Uber Shader
10. 아트마다 하나씩
• 장점
• 필요에 따라 셰이더를 자유로이 만들 수 있음
• 언리얼 등을 비롯 노드기반 셰이더를 지원하는 프로그램도 있음 (요즘 추세)
• 단점
• 셰이더 관리
• 성능
• 생각보다 아티스트(테크 아티스트가 아닌)가 배우기 힘듬
12. 대충 종류별로 하나씩
• 게임에 들어가는 아트 종류별로 셰이더를 하나씩 만듬
• 캐릭터 셰이더, 소품 셰이더 등등
• 장점
• 셰이더 관리가 쉬움
• 성능
• 단점
• 새로운 실험을 하거나 셰이더를 새로 만들기 힘듬
• 안쓰는 패러미터의 기본값 설정하기 귀찮음… -_-
13. UBER SHADER
• 셰이더 하나로 모든걸 처리. 무수히 많은 ON/OFF 스위치
• 장점
• 실험하기 정말 쉬움
• 게임 셰이더 관리도 쉬움 (하나뿐이니 -_-)
• 단점: 전에 설명했던 방법들의 모든 단점의 총집함
• 아티스트 고문
• 성능
17. 정작 모든 셰이더 시스템의
문제점은..
• 프로그래머 위주의 생각…
• 아티스트에게 프로그래머 위주의 생각을 강요. (예: 이건 수학적으로 원래 그렇게
작동하는거니 이렇게 이해해서 해요 -_-+ )
• 물론 아티스트가 징징 거릴땐 귀찮음 -_-;;;;
• 아티스트가 좋아하는 툴만 주면 그거 만지면서 신나서 조용해짐..(응?)
18. 아티스트가 생각하는 방법 1/2
• 렐릭 테크니컬 아티스트와 수많은 미팅 (Thanks, Nick Carota!)
• 5가지 큰 카테고리로 생각
• Diffuse: 표면의 색은 어떤가?
• Bumpiness: 표면이 얼마나 울퉁불퉁한가
• Reflectance: 표면의 반사정도는?
• Lighting: 조명 관련
• Etc: 기타 잡다한것, 생각하기 싫은것, 꼴도 보기 싫은 것.. (응?)
19. 아티스트가 생각하는 방법 2/2
• 이것저것 시도(experiment)를 할 수 있어야함
• 단 주관식보단 객관식이어야 함
• 결론:
• 아티스트에겐 직관적인 객관식 UI
• 3DS Max 내에서 실시간 실험이 가능하도록 속은 Uber Shader
20. UI 뜯어고치기 – ITERATION 1
• 아티스트가 생각하는 category별로 UI 제공
• 게임에서 보는 것처럼 셰이더 기법의 실시간 프리뷰 가능(WYSIWYG)
44. 기타
• 물리 성질
• 오디오 등에 이용
• 블렌딩 모드
• 컬링 모드 등등
• 소팅 바이어스
45. UI 뜯어고치기 – ITERATION 2
• 3DS Max의 DirectX 머테리얼이 지원하는 UI Interaction 모두 지원
• 버튼 위에 텍스처 파일 끓어놓기
• 오른쪽 버튼 복사 오른쪽 버튼 붙여넣기 지원
• 버튼 위에 오른쪽 마우스 버튼 눌러 파일 경로열기
• 등등등….. 정말로 온갖 잡다한 것들…. -_-
• Max 자체 컨트롤로 지원 불가능 좌절 Max에서 .NET Object 지원
• 단 3DS Max 9에서 .NET 컨트롤을 함수인자로 못건냄 복붙복붙 3874라인 코드 -_-
47. UI 뜯어고치기 – ITERATION 3
• 게임 조명 Preview
• 캐릭터 기법도 포함 별도의 category
48. 게임조명 PREVIEW
• 별도의 UI
• 게임속 대표 레벨들의 조명세팅을
3개의 라이팅 정보로 저장
• 근사치일 뿐
• 게임은 디퍼드
• 맥스는 포워드
49. 캐릭터 기법
• 싱글/멀티플레이어용 캐릭터 구분
• 멀티플레이어일 경우 3가지 페인트
색상으로 프리뷰 가능
• Preset으로 색상을 프리뷰할수 있는
별도의 UI도 존재
50. 캐릭터 기법
• 게임속에서는 데칼, 페인트 색 등을
유저 커스터마이제이션에서 받아옴
• 멀티플레이어 레벨 로드시 텍스처
조합 및 페인트 적용 후 실시간 DXT
압축
• 따로 강연을 할 정도의 방대한 양이니
이걸로 생략….
51. 프로그래머를 위한(?) 내부구현 원리
• 3DS Max UI는 Uber Shader의 각 스위치를 끄고 켜는 역할이 주
• pNormalOn = 1
• pDiffuse2On = 1
• pTintColourOn = 0
• 텍스쳐 등 기타 parameter를 대입하기도 함
• pDiffuseColour = vector4(1, 0, 0.2, 0.5);
• pDiffuseTexture = LoadTexture(“c:popeImSoSexy.png”);
52. 2. 성능 문제 해결
• 아티스트가 선택한 옵션에 따라 게임 셰이더와 매핑 (예: Diff2_Norm_Spec.shd)
• 하지만 정말 창의적인 아티스트가 아직 게임속에 없는 셰이더를 만들면?
Diff2UV01_VtxTint_Norm2_Spec2 셰이더가
없습니다. 핫핑크 셰이더로 대체하겠습니다.
이 셰이더를 추가하려면 셰이더 문지기를
찾아주세요~
53. 게이트 키퍼?
• 어떤 셰이더를 게임속에 넣을건지 결정하는 렌더링 프로그래머
• 스페이스마린 프로젝트에선 발표자(포프)가 게이트키퍼였음
• 존재이유: 아티스트의 필요와 성능상의 밸런스 유지
• 간단히 말해 노드기반 셰이더 제작의 단점 해결
• 아티스트가 비슷비슷한 수천개의 셰이더를 만드는 것을 방지
• 성능이 확~ 떨어지는 셰이더 제작을 방지
54. 검토 가이드라인
• 셰이더 하나에 쓸 수있는 텍스처는 5개 (술 사주면 6개까지 허용 -_-)
• 이미 존재하는 기법중에 UV 채널만 바뀐 게 있나 확인
• 좀 더 최적화된 셰이더를 이용할 수 있는지 검토
• 예: 텍스처 대신 일반 변수 하나로 처리할 수 있는 경우
• 검토에 걸리는 시간은 5분 미만
• 결과에 따라 결정은 둘 중 하나
55. 아무 문제 없을 경우
오오~ 정말 필요한 셰이더구만.
성능도 문제없고 아트도 정말
이쁘고…
응응~ 내가 5분안에 추가해줄께~
잠만 기둘려~
꺄아~ o(^_^)o
60. 굳이 3DS MAX에서 이짓을 한
이유는?
• 아트품질 향상
• Tech Artist가 아닌 일반 아티스트가 Uber Shader로 실험 가능
• 실험 중에는 게임 셰이더에 제한받지 않음
• 3DS 맥스는 아티스트가 가장 좋아하고 온갖 꼼수를 다 부릴 수 있는 툴
• 게임으로 export해서 테스트하는 데 낭비하는 시간이 없음 무한 Iterations
• 아티스트 게임 중간에 Gate Keeper를 둠으로써 성능문제도 해결
79. 낭비하는 시간 비교
(텍스처 수정 20회, 프리뷰 10회)
• 다른엔진: 20 x 5초 + 10 x 1분 = 11분 40초
• 스페이스마린: 20 x 5초 + 1 분 = 2분 40초 4.375배 빠름!
80. 낭비하는 시간 비교
예: (텍스처 수정 20회, 프리뷰 100회)
• 다른엔진: 20 x 5초 + 100 x 1분 = 101분 40초
• 스페이스마린: 20 x 5초 + 1 분 = 2분 40초 38.125배 빠름!
81. 낭비하는 시간 비교
예: (텍스처 수정 20회, 프리뷰 100회)
• 다른엔진: 20 x 5초 + 100 x 1분 = 101분 40초 사실상 불가능!
• 스페이스마린: 20 x 5초 + 1 분 = 2분 40초 38.125배 빠름!
82. 하지만 문제는 있었다.
• 게임 출시를 몇 달 앞두고 다른 팀에서 아티스트들을 많이 빌려옴
• 하지만 출시가 임박해서 더 이상 새로운 셰이더 추가 불가
• 더 이상 실험(experiment)는 의미가 없음
• 기존에 있던 셰이더를 골라서 사용하는 게 더 일반적인 workflow가 되었음
83. 간단한 꼼수
• 맥스 우버세이더 머테리얼에 새로운
rollout 추가
• 현존하는 셰이더를 하드에서 검색
• 셰이더 이름 토큰따라 맥스
우버셰이더의 옵션을 키고 꺼줌
84. 게임 / MAX간의 차이
• 디퍼드 / 포워드 라이팅 차이
• SSAO
• World Space AO (http://kblog.popekim.com/2011/11/blog-post.html 참조)
• 색상 보정 (Color Correction)
• 기타 Full-screen 효과들
• 그래도 90프로 이상 매치!!
85. 정리 / FUTURE WORK / 주의할 점
• 테크니컬 아티스트의 중요성: VISION!
• Future Work: 비슷한 셰이더들을 모아서 공통된 부모 셰이더로 합쳐주기
• 이럼 Category별로 셰이더 만들어 주는것과 비슷함
• 셰이더 스위칭에 따른 성능저하 방지 (라고 하나 이젠 별 의미 없을지도…?)
• 주의할 점:
• 새 맥스 뷰포트에선 작동안함(preference viewport choose driver Direct 3D
• fx파일의 pass에서 SRGBWriteEnable 지원안됨(Max 2012) 셰이더 코드로 변환
86. 그냥 재밌는(?) 통계
• Max 우버셰이더: 1940줄 (자체 셰이더 노드 에디터로부터 생성)
• 머테리얼용 맥스 스크립트 : 3873줄 (.NET 버튼 Object등을 인자로 못넘겨서 복붙)
• 최종 셰이더 수: 107개
• 컴파일된 셰이더 크기: < 8MB
• 아티스트 Iteration 횟수: 수없이 많이, 아마 게임사상 최고일지도 -_-
• 아티스트의 포팅 요청: 새로운 게임팀에 갈 때마다…
87. SPECIAL THANKS
• 발표 허락해준 현/전 회사: EA 스포츠 FIFA, Relic Entertainment(SEGA)
• 같이 이 셰이더 UI를 발명한 렐릭의 전 테크니컬 아티스트 Nick Carota
• 멋진 셰이더 정의를 훔쳐 쓰게 허락해주신 Ndoors의 정종필 부장님
• 강연자료 검토 및 피드백 주신 이현정님
• 제 블로그와 유튜브를 즐겨 봐주시는 분들
• 라고님, 이네노님 ( 이유는 다음 장에… -_-;;;; )