Tuesday, December 1, 2015

Unity DirectCompute 튜토리얼 시리즈 번역 - 1

개인 학습 및 정보 공유 차원에서 Unity에서의 DirectCompute(compute shader를 사용한) 튜토리얼 시리즈 번역을 할 예정입니다. 원작자에게 허가를 받은 사항입니다.

현재 6편이 포스팅되어 있으며 가능한 하루에 하나씩 번역해 올릴 생각입니다.

원문은 ScrawkBlog (http://scrawkblog.com/)에서 보실 수 있습니다. 좋은 자료가 많이 있으니 관심 있으신 분들은 한번 들어가 보세요.

아래 개요 부분에 잘 나와있지만, GPGPU 프로그래밍을 위해 여러 API가 개발되었고, 개발되고 있습니다만, 현재, 그리고 앞으로도 Unity에서 가장 쉽게 이를 활용하기 위한 방법은 DirectCompute를 통한 방법이 될 것 같습니다. 하지만 Documentation이 현재 매우 부족한 상태이고(블로그 글이 1년 전인데, 그 때도 그랬다고 합니다...), 저도 검색하다 위 블로그를 발견하여 많은 도움을 얻었습니다. 필요하신 분들에게 도움이 되었으면 좋겠습니다.

(*제가 추가한 부분은 역주 표시가 되어있으며, 일부 한/영 번역이 일관성이 부족할 수 있습니다 ㅜㅜ)
---------------------------------------------------------------------------------------------------

UNITY를 위한 DirectCompute  튜토리얼: 개요

- From ScrawkBlog (http://scrawkblog.com/)

저는 유니티를 2년정도 사용해왔지만, 이전에는 C++로 직접 그래픽스 프로그램을 만들었었습니다. OpenGL을 사용했었고, 그러면서 GLSL 셰이더 프로그램 경험을 많이 쌓았죠. Unity를 사용하면서부터는 Cg 셰이더를 사용했습니다. GLSL과 Cg 셰이더는 크게 다르지 않아서 쉽게 바꿀 수 있었습니다(GLSL도 사실 Unity에서 지원하지만, 그렇게 많이 사용되지는 않습니다). OpenGL 사용 경험은 방대한 연구용 코드의 포팅, 주로 OpenGL 코드를 Unity로 변환하는 것을 가능하게 하는 데 많은 도움이 되었습니다(예들 들어, 최근의 Proland port).

 이제 Unity가 Microsoft DirectX 11을 지원하기 시작했고, DirectX 11에는 DirectCompute API가 있습니다. 이 API는 compute shader를 통한 GPU의 활용에 대한 완전히 새로운 방법을 가능하게 합니다. 다만 문제가 하나 있는데요. DirectCompute의 사용에 관한 튜토리얼이나 문서화가 부족하다는 것입니다. 구글 검색에서도 많이 나오지 않고, Microsoft의 문서도 적고 아마존에서도 몇 개의 책들만이 이 주제를 다루고 있습니다. 좋은 자료를 찾으면 코멘트 부분에 링크를 남겨주시면 좋을 것 같습니다.(역주 : 이 블로그의 모든 코멘트 창은 현재 닫혀있음 ㅜㅜ)

 지난 몇 년 동안, 이 강력한 API를 사용하는 방법에 대한 자료를 수집했고, 여전히 그에 관한 정보들은 부족하게 생각되어 Unity에서 DirectCompute를 사용하는 법에 대한 튜토리얼 시리즈를 작성하기로 결심했습니다. 왜 DirectCompute가 필요하고 기존 그래픽스 파이프라인과 어떻게 다른지, compute shader를 통해 커널을 어떻게 구현하는지, GPU 내부의 쓰레드 tiling이 어떻게 동작하는지, 텍스처에 어떻게 접근하는지, 여러 버퍼 타입을 어떻게 사용하는지, 쓰레드 동기화와 공유 메모리를 어떻게 사용해야 하는지와 최종적으로 어떻게 성능을 향상할 수 있는지에 대한 소개로 시작하고자 합니다.

이 튜토리얼들은 Cg 셰이더에 대한 지식은 필요로 하지 않지만, compute shader를 쓰기 전에 보통의 Cg 셰이더에 대한 확실한 이해를 하기를 추천합니다. 보토 compute shader로 처리하는 데이터는 가시화 될 데이터들이고, 이러한 결과를 위해서는 보통의 Cg 셰이더가 필요하기 때문입니다. 하지만 이러한 내용도 어쨌든 다룰 예정입니다. Compute shader는 Microsoft의 HLSL로 쓰여집니다. 튜토리얼을 이해하기 위해 이 언어를 알아야 할 필요는 없지만, 적어도 하나의 셰이더 언어(GLSL, Cg 또는 HLSL)에 대한 경험을 해보길 추천합니다. 다행히 HLSL과 Cg는 매우 유사해서 차이점을 알아채기 어려울 정도입니다. 또한 Monodevelop이 기본적으로 제공하지 않기 때문에, compute shader를 위한 syntax highlighter를 세팅하기를 추천합니다.

그래픽스 파이프라인


DirectCompute가 왜 필요한지 이해하려면 기본적인 그래픽스 파이프라인과 그 역사에 대해 이해하는 것이 도움이 됩니다. 모든 것은 90년대 초반에 시작되었습니다. 3D 그래픽스가 대중적이 되었고, 컴퓨터에서 GPU가 기본 사양이 되기 시작한 시기죠. 필요한 것은 개발자가 이 강력한 장치를 제어할 수 있는 그래픽스 API였습니다. 1992년에 SGI에서 개발한 IRIS GL이라는 독점적인 시스템에 사용될 OpenGL 1.0이 릴리즈되었습니다. Microsoft는 SGI, Digital Equipment Corp, IBM, Intel과 함꼐 OpenGL표준 개발을 가이드하는 OpenGL 아키텍처 리뷰 위원회 중 하나였습니다. 제정 후 얼마 뒤에 Microsoft는 위원회를 나와 경쟁 시스템인 DirectX API의 한 부분인 Direct3D 개발을 시작했습니다. 위원회는 나중에 Khronos 그룹으로 발전하였고 현재 멤버는 3Dlabs, ATI, Discreet, Evans & Sutherland, Intel, NVIDIA, SGI와 Sun Microsystems입니다.

개발자가 해야 할 일은 렌더링 될 지오메트리를 GPU로 전송하는 것이었고, OpenGL은 픽셀들이 화면에 디스플레이 되기까지의 파이프라인으로 그것들을 전달합니다. 이 파이프라인은 일부분을 켜거나(enable) 끄거나(disable) 일부 세팅을 변경할 수 있긴 하지만 고정적인 것이었고, 바꿀 수 있는 부분은 많이 없었습니다. 얼마 간은 그것이 필요한 전부였지만, 개발자들이 GPU를 더 활용하고, 발전된 기능들을 필요로 하게 되면서 이 파이프라인이 좀 더 유연성을 가져야 한다는 것이 명확해졌습니다. 해결책은 파이프라인의 특정 부분을 프로그램 가능하도록 하는 것이었죠. 이제 개발자들은 파이프라인의 특정 부분에 대해 프로그램을 작성할 수 있었습니다. 이 새로운 프로그램은 셰이더 (프로그램과 셰이더에 대한 기술적인 차이가 있긴 하지만, 그건 다른 이야기로 합시다)라 알려지게 되었습니다.

이 프로그램 작성 가능한 파이프라인은 완전히 새로운 가능성을 열어주었고, 그것이 없었다면 최근 세대의 게임에서와 같은 품질의 그래픽은 불가능했을 것입니다. 한편, 파이프라인은 원래 그래픽을 생성하기 위해 개발되었지만 새로운 유연성은 이제 GPU가 여러 종류의 알고리즘을 처리하는 데 사용될 수 있다는 것을 의미합니다. 다양한 연구들이 재빨리 알고리즘을 GPU의 멀티쓰레드 환경에서 동작하도록 수정하기 시작했고, 물리, 금융, 수학, 의학과 다른 많은 분야에서 데이터 처리를 위해 GPU를 사용하기 시작했습니다. GPU의 성능은 거부하기 힘든 것이었고, GPGPU 또는 General Purpose Graphical Processing Unit 프로그래밍이 탄생하게 되었습니다.

General Purpose Graphical Processing Unity 프로그래밍


 GPGPU는 빠르게 주류가 되었고 산업적인 용도로 사용되었습니다. 하지만 여전히 한 가지 문제가 있었는데, 그래픽스 API가 여전히 그래픽스 파이프라인에 묶여있다는 것이었습니다. 파이프라인의 어떤 단계에서 아무리 셰이더가 많은 유연성을 제공한다 하더라도, 파이프라인의 제약에 따라야 했습니다. 정점 셰이더(vertex shader)는 여전히 정점을 출력해야 했고, 픽셀 셰이더(fragment shader)는 여전히 픽셀을 출력해야 했습니다. 엄청난 진보와 창의적 작업물들이 개발되면서, GPGPU가 더 발전하려면 변화가 일어나야 한다는 것이 확실해졌습니다. 개발자를 그래픽스 파이프라인이라는 족쇄로부터 자유롭게 하고, 그래픽스와 관련이 없는 세팅에서도 GPU의 성능을 활용할 수 있도록 하는 환경을 제공하는 API가 필요하게 되었습니다. 

그 후 몇 년간 GPGPU API가 나타났고, 현재 개발자들은 CUDA, OpenCL, DirectCompue를 선택할 수 있습니다. 이 새로운 API들은 GPU로 작업할 수 있는 새로운 방법을 제시하였으며, 전통적인 그래픽스 파이프라인에 더 이상 구속되지 않습니다. 여전히 약간의 제약이 있지만, 다른 어떤 방법보다도 멀티쓰레드 환경에서의 작업을 하기 적합합니다.

 GPGPU에 대한 필요성은 그래픽과 관련 없는 환경에서도 GPU를 활용한 작업 방법을 제시하는 것이었으나 당연하게도 게임 업계도 마찬가지로 이 새로운 기능을 활용하는 데 열정적입니다. 게임들이 점점 리얼해지면서, 실세계의 물리현상을 시뮬레이션하기 시작했습니다. 이러한 계산은 복잡하고, 많은 처리를 필요로하는 경우가 많습니다. GPGPU가 제공하는 성능과 유연성으로 훨씬 상세하고 광범위하게 이러한 계산이 가능합니다. 기존 그래픽 API가 3D 게임에 새로운 세상을 열었다는 것은 우리 모두가 받아들이는 바입니다. GPGPU API는 이제 같은 길을 걷고 있고, 게이밍에 대로운 시대를 열 것입니다. 현 세대의 게이밍은 이러한 API의 활용으로 가능해진 현실적인 그래픽과 물리 현상으로 가득해질 것입니다.

이제 당신이 해야 할 일은 그것들을 사용하는 방법에 대해 배우는 것 뿐입니다. 커널을 세팅하고, 쓰레드 작업을 할당하는 법을 다음 파트에서 보여드리겠습니다.

아래는 현재 dx11의 파이프라인 그림입니다.



No comments:

Post a Comment