[3D 그래픽 엔진을 만들어보자] - 1. Juce Framework 튜토리얼
시작에 앞서 앞으로 사용하게 될 JUCE Framework(이하 JUCE)에 대해 간단히 살펴보는 시간을 가지겠다. JUCE는 ROLI라는 영국의 악기 만드는 회사가 소유권을 갖고 있고, Julian Storer라는 개발자가 리드 프로그래머로 있는 C++ Framework이다. 기본적으로 Audio Programming에 특화되어 있으며 각종 UI Component들과 내부적으로 잘 짜여진 데이터 구조를 지원한다. 또한 기본적으로 여러 OS에서 동작할 수 있도록 크로스플랫폼 빌드를 지원한다.
현재도 활발히 업데이트가 되고 있는데 요즘은 업데이트 속도도 점점 빨라지는 것 같다. 나는 지금까지 만 2년 정도 이 Framework을 사용했는데 처음 접했을 당시 4.1버전이었고 지금은 벌써 5.3 버전까지 올라와있다. ROLI에서는 JUCE를 널리 알리기 위해 오디오 개발자 컨퍼런스도 ADC라는 이름으로 매년 런던에서 개최하고 있다.
ROLI의 대표 악기인 Seaboard는 라라랜드에서도 라이언 고슬링이 연주하는 장면이 등장한다. ADC2017에 갔었을 때 만져볼 기회가 있었는데 생각보다 세게 눌러야 하고, 건반을 두드리는 것보다는 문지르듯이 연주해야 한다.
JUCE는 일단 기본적으로 Audio Programming을 위한 여러가지 강력한 기능들을 제공한다. Class 몇 개를 간단히 조합하면 단순한 Audio Player도 금방 만들 수 있고 Sample 단위로도 신호처리 알고리즘을 바로 적용해볼 수 있도록 설계 되어 있어서 DSP를 공부하는 C++ 개발자들에게 매우 훌륭한 Framework이다. 또한 같은 코드로 여러 타입의 Audio Plugin을 개발할 수 있도록 Wrapper 역시 제공하는데, 이 덕분에 여러 Plugin 회사들이 JUCE를 이용해서 VST, AAX, AU 타입 제품을 빠른 시간 내에 개발할 수 있게 되었다.
대표적인 DAW중 하나인 Pro Tools와 그 위에서 동작하는 Plugin의 모습이다. 는 우리 회사 제품
JUCE가 멋진 또 하나의 이유는 바로 기본적으로 크로스플랫폼 빌드가 된다는 점이다. JUCE의 코드를 깊이 살펴보면 빌드 환경의 OS를 감지하여 Native UI를 지원하도록 만들어져 있다. 이를 통해 Plugin의 UI를 개발하는 시간 또한 엄청나게 단축시켜준다. 지원하는 OS는 Windows / Mac OS X / Linux는 기본이고 Android와 iOS 역시 지원한다. 하지만 모바일의 경우는 Native UI 컴포넌트를 사용하지는 못하고 JUCE Framework의 컴포넌트를 사용해야 한다.
이미 크로스플랫폼 Framework의 세계에서는 Qt가 최강자로 군림하고 있지만 그렇다고 JUCE가 마냥 하위호환인 것만은 아니다. Audio Plugin 개발에 있어서는 JUCE를 따라올 만큼 편리한 Framework가없고, GUI 개발 기능 역시 QtCreator 못지 않게 강력하다. 또한 사용자가 원하는 IDE로 프로젝트를 자동으로 생성해주는데, 한 번에 여러 플랫폼의 프로젝트를 관리할 수 있기 때문에 크로스플랫폼 개발의 관점에서도 상당히 편리하다. 덕분에 지금 쓰고 있는 튜토리얼 코드도 회사의 Mac OS와 집의 Windows에서 모두 동일하게 동작한다.
같은 코드로 Ubuntu, Windows, Mac OS의 App을 동시에 개발한다.
이번 튜토리얼에서는 이 JUCE를 이용해서 UI윈도우를 가진 실행파일을 빠르게 만들어 볼 것이다. 그리고 하나의 JUCE 프로젝트 파일만으로도 여러 플랫폼에서 빌드할 수 있는 프로젝트 파일들이 만들어지는 것을 확인해보도록 하겠다.
1) JUCE 설치
JUCE는 기본적으로 무료 사용이 가능하다. 다만 실행 시 윈도우 오른쪽 하단에 잠깐 워터마크가 떴다가 사라진다는 차이만 있고 기능에 제약이 생기는 것은 없다. 다운로드는 아래 링크에서 받을 수 있다.
다운로드 받은 폴더를 열어보면 이런 구조로 되어있을 것이다. DemoRunner.exe를 잠깐 실행시켜보도록 할까.
여러 DSP 예제들이 준비되어 있다.
예전엔 없었는데 SIMD 예제가 추가됐다! 나중에 꼭 써봐야지
OpenGL 예제도 있다. 하지만 GLSL은 제일 낮은 버전이다.
예전엔 Demo도 상당히 빈약한 편이었는데 이제는 종류가 엄청 늘어났다. 이 데모들만 다 이해해도 JUCE를 전부 이해했다고 할 수 있을 정도로 잘 갖춰져 있다. 나중엔 TensorFlow Wrapper도 만들어지지 않을까 내심 기대해본다.
2) Project 생성
이번에는 Projucer.exe를 실행한다. 생성할 수 있는 프로젝트의 종류가 다양한데, 일종의 템플릿 형태기 때문에 꼭 이것을 통해서만 만들 수 있는 것은 아니다. GUI Application 프로젝트를 생성하더라도 설정을 바꾸거나 클래스를 상속받는 방법 등으로 얼마든지 Audio Application이나 다른 종류의 Application을 개발할 수 있다. 자세한 설명은 다음으로 미루고 오늘은 가장 첫 번째에 있는 GUI Application을 클릭해 보겠다.
오른쪽에 보이듯이, 다양한 IDE를 지원한다. 여러 개를 클릭할 수도 있어서 Windows에서도 Xcode project의 설정을 관리할 수 있다. Visual Studio는 2017까지 지원하고. Xcode도 9.1에서 문제 없이 돌아가는 것을 확인했다. 나머지는 잘 모르겠지만 잘 되겠지 ㅎ 적절한 프로젝트 이름을 붙여주고 다음으로 넘어간다.
아앗 시작부터 에러가
이런 메세지가 뜰 수 있는데, 프로젝트 설정창 오른쪽 상단에 있는 JUCE module의 경로가 잘못되어서 그렇다. 위에 있는 폴더 목록 사진을 보면 modules라는 폴더가 있다. 해당 경로를 Modules Folder로 지정해주면 에러가 사라진다.
조그마한 IDE처럼 생겼다. 실제로 간단한 코드 편집은 여기서 해도 될 정도로 편리하다.
자동으로 생성된 C++ 코드가 벌써 세 개나 있다. 천천히 뜯어보는 것은 나중으로 천천히 미뤄두고 일단은 상단에 있는 Visual Studio 아이콘을 세게 눌러보자.
몇 번의 클릭만으로도 벌써 근사한 프로젝트 솔루션 파일이 만들어져서 기분이 좋다. 어서 빨리 F6를 눌러 빌드가 잘 되는지 확인해보자.
1>------ 빌드 시작: 프로젝트: JUCEPractice1_App, 구성: Debug x64 ------ 1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Platforms\x64\PlatformToolsets\v141\Toolset.targets(36,5): error MSB8036: Windows SDK 버전 10.0.16299.0을(를) 찾을 수 없습니다. 필요한 버전의 Windows SDK를 설치하거나, 솔루션을 마우스 오른쪽 단추로 클릭하고 [솔루션 대상 변경]을 선택하거나 프로젝트 속성 페이지에서 SDK 버전을 변경하세요. 1>"JUCEPractice1_App.vcxproj" 프로젝트를 빌드했습니다. - 실패 ========== 빌드: 성공 0, 실패 1, 최신 0, 생략 0 ==========
하지만 시작부터 운이 좋지는 않았다. 이런 에러 메세지가 떴는데 아무래도 Windows SDK의 버전 문제인 것 같다. Visual Studio에서도 해결할 수 있지만 JUCE의 Project 설정을 통해 해결하면, 이후에도 지속적으로 적용시킬 수 있다. 우선은 현재 이 컴퓨터에 설치되어 있는 Windows SDK의 버전을 확인할 필요가 있다. 우선 현재 솔루션을 오른쪽 클릭해보자.
프로젝트 대상 변경, 영어로는 Project Daesang Byunkyeong...이 아니고 Retarget SDK Version이라는 항목이 있다. 얼른 클릭해보자.
그러면 현재 이 프로젝트에서 사용하고 있는 Windows SDK의 버전이 10.0.17134.0이라는 사실을 알 수 있다. 이 숫자를 외워둔 상태에서 아까 처음에 만들었었던 Juce 프로젝트 파일로 다시 가보자.
왼쪽의 메뉴에서 Exporters > Visual Studio 2017을 클릭하면 해당 솔루션 파일의 설정 값들 리스트가 나오는데, 아래로 스크롤 해보면 Windows Target Platform이라는 항목이 있다. 왠지 익숙한 듯 하지만 낯선 숫자가 적혀있다. 저 부분에 아까 확인했던 SDK 버전을 입력해주자. Visual Studio에 익숙한 사람이라면 위에 있는 Platform Toolset에도 자연스레 눈이 갈텐데, 저것을 다른 것으로 수정해주면 더 낮은 버전의 msbuild로도 빌드가 가능하도록 설정할 수 있다. 이런저런 설정들이 많으니 궁금하다면 하나씩 건드려보면 좋다.
바꾼 설정을 저장하고, 다시 Visual Studio로 돌아가보면 다음과 같은 알림이 뜬다. 솔루션 다시 로드를 눌러서 통째로 Refresh를 해주자. JUCE 프로젝트에서 단순히 코드만을 수정하는 경우는 솔루션을 통째로 다시 로드 할 필요 없이 '다시 로드'만 눌러줘도 된다. 이제 빌드가 성공적으로 완료되는 것을 확인할 수 있다. 어서 빨리 F5를 눌러 실행을 시켜보자.
아, 언제 봐도 설레는 문장! 안녕!
코드는 한 줄도 치지 않고도 실제로 실행되는 윈도우를 만드는데 성공했다. 긴 천리길에서 이제 한 걸음을 내딛었지만 내심 뿌듯하다.
3) 크로스 플랫폼 빌드
또 다시 몇 번의 클릭으로 이번에는 같은 프로그램을 Mac OS 버전으로 만들어 보겠다. 다시 Projucer로 돌아가자. 왼쪽 메뉴의 Exports 항목을 클릭한 뒤 빈 공간을 오른쪽 클릭하면 프로젝트를 생성할 수 있느 IDE의 목록이 나온다. 여기서 Xcode(MacOSX) 항목을 선택한다.
다 해줄 줄 알았지만 안 되는건 안 되는거다.
미리 준비해뒀던 맥북을 꺼내 아까 압축했던 파일을 USB에 담아 원하는 위치에 옮긴다. 아 물론 Mac OS에도 Projucer가 설치되어 있어야 한다는걸 잊지 말자. 설치 과정은 Windows와 정확히 같다.
Projucer를 열어보자. UI의 LookAndFeel이 Windows와 완전히 같은 모양으로 만들어져 있다. 별거 아닌 것 같지만 감동스러운 부분이다. 이번에는 상단의 Xcode 버튼이 활성화 되어있다! 세게 눌러주자.
또 만났네 안녕!