|
크로노스그룹(Khronos Group)이 관리하는 컴퓨터 그래픽스 업계의 표준이 된 OpenGL 홈페이지의 메인 문구는 아래와 같다. The Industry's Foundation for High Performance Graphics FROM GAMES TO VIRTUAL REALITY, MOBILE PHONES TO SUPERCOMPUTERS 원래 OpenGL은 그래픽스 용도로 만들어져 사용되었으나 현재 업계의 상황으로 인해 컴퓨팅 환경에도 사용되고 임베디드, 안드로이드 같은 모바일 폰 에서 PC, 슈퍼컴퓨터까지 폭 넓게 사용되는 이른바 업계의 진정한 표준이라고 할 수 있다. 이렇게 OpenGL이 성공할 수 있었던 이유는 이름에서 알 수 있듯 공개되어 있어 일부 플랫폼에서만 사용할 수 있는 다른 프레임웍, API들과 차별되는 기술이었던 덕분이다. Nvidia 칩셋에서만 사용할 수 있는 Cuda, iOS 환경에서 사용할 수 있는 Metal, Windows 환경에서 사용하는 Direct X, 컴퓨팅 목적으로 만들어졌으나 모든 환경에서 완벽지원이 되지 않는 현실인 OpenCL 등의 상황을 고려하면 하위호환을 위해 큰 아키텍처 변경이 피하면서 효율적으로 성장하지 못한 구시대 기술로 볼 수 있는 OpenGL이 아직도 최고의 자리에 있는 것이 이해될 수 밖에 없다. 하지만 세월이 흘러, OpenGL을 그래픽스 환경에만 이용하지 않고 앞서 언급한 제한된 환경으로 인해 GPU의 성능을 컴퓨팅(계산)에도 이용하고자 하는 시도들이 많이 나오게 된다. 만약 모든 그래픽 프로세서가 Nvidia의 칩셋으로 되어 있다면 Cuda를 이용할 수 있고, 모든 환경에서 OpenCL이 완벽 지원된다면 좋았겠지만, 절대적으로 많이 사용되는 OpenGL처럼 호환 및 동작이 검증되는 API는 없기에 이를 이용하게 된 것이다. 또한 GPU의 성능이 비약적으로 발전하면서 강력해진 GPU 리소스를 직접적으로 이용하고 싶어하는 요구가 강해지면서 기존의 OpenGL을 업그레이드 하는 것이 아닌 새로운 아키텍처로 강력한 성능을 내도록 만들어 진 것이 Vulkan API이다. Vulkan은 OpenGL처럼 다양한 플랫폼에서 사용할 수 있는 것을 보장하고, 뛰어난 성능과 최신의 고성능 GPU를 직접적으로 제어할 수 있다. 이런 배경지식을 갖고 있던 상황에서 Vulkan에 대해서 좀 더 알아보고 싶어 가장 최근 책인 한빛미디어의 <처음 만나는 Vulkan>을 읽어보았다. ![]() 책을 통해 알게된 내용을 몇가지를 아래와 같이 정리해본다. - Vulkan API는 AMD의 Mantle API를 기반으로 개발되었다. AMD가 Mantle API를 기부하여 진행된 것인데, 아무리 노력해도 Nvidia의 CUDA를 따라잡을 수 없는 상황이니 Open Source의 힘으로 나은 상황을 만들어보려는 AMD의 노림수가 아닐까? - OpenGL은 임베디드, 모바일폰에 사용되는 별도의 버전인 OpenGL ES가 존재하였으나, Vulkan은 일관성있게 모든 플랫폼에 대해 하나의 API만 존재한다. 모바일이 최우선이 되어버린 현재 상황에 맞게 Vulkan은 기존과 달리 모바일 플랫폼이 최우선 된다. - 스테이트 머신이 기반인 OpenGL에서는 멀티 스레딩 확장성이 좋지 않았으나, Vulkan은 암묵적인 전역 스테이트가 없고 개발자가 멀티 스레딩 기능을 완전히 활용할 수 있도록 처음부터 설계되었다. - 기존 OpenGL에서 화면 표시를 위해 운영체제의 윈도우 시스템 프레임버퍼를 직접적으로 사용하는데, Vulkan은 더 쉽고, 다양한 OS를 지원하는 일관된 API표준인 WSI를 지원하고 이를 통해 지원한다. 사실 GPU를 이용한 개발은 기존 프로그래밍 언어만 해왔던 분들에게는 또 다른 도전과 영역이라 할 수 있다. 많은 프로그래밍 책들이 처음 예제로 사용하는 Hello world!를 출력하는 소스 코드와 이 책의 첫 프로젝트를 비교하면, 일단 간단한 프로그램의 구조와 출력 함수를 알면 몇 줄 심지어 한 줄로 출력되던 기존의 프로그래밍과 너무나 복잡함을 알 수 있다. 이 책에서 쉽게 설명하려고 많이 노력했지만 GPU 기본이나 그래픽스 기본까지 전부 알려줄 수 있는 양은 되지 못한다. 기존 OpenGL, OpenCL, Metal 등을 사용하던, 공부하던 개발자가 앞으로 대세가 되리라 확신할 수 있는 Vulkan에 대한 공부를 시작하는 교재로는 Vulkan이 OpenGL과 어느 부분이 다르고, 어떻게 사용하는지에 대해 자세히 알려주는 책으로 적당한 것 같다. 이 글을 작성한 이후 크로노스 그룹이 Vulkan API 1.1 을 발표했다. https://www.khronos.org/news/press/khronos-group-releases-vulkan-1-1 인상적인 점은 developer-requested features, 즉 실제 사용을 시작한 개발자들이 요청한 부분을 반영을 하고 있다는 것이다. Vulkan을 더 주목을 하지 않을래야 않을 수 없을 것 같다. |
|
02월 13일 리뷰 - 리뷰자 김종욱
파르민더 싱 지음, 이환용 옮김
기존의 그래픽 라이브러리는 윈도우의 경우 DirectX 그리고 안드로이드 폰의 경우 Opengl/ES 그리고 mac의 경우 metal로 나뉘었다. 본 블로거의 경우 2D 기반의 게임그래픽 프로그래밍을 많이 한 경력이 있기 때문에 위의 세 라이브러리를 이용하여 각각의 플랫폼에 맞는 2D그래픽들을 가속화하여 랜더링하는 프로그래밍을 많이 했었다. 다만 위의 프로그래밍을 할때 마다 느꼈던 점은 각각의 플랫폼 마다 최적화된 라이브러리가 서로 상이하다보니 서로 다른 그래픽 라이브러리를 사용해야한다는 점과 해당 라이브러리들 만이 가지고 있는 특징과 절차가 상이 하기 때문에 이로 인해 발생하는 비용과 시간이 엄청나다는 것이였다.(물론 윈도우와 Opengl을 사용할 순있다.(mac은 안해봐서 잘 모르는 이유로 인해 생략하였다.)) 이러한 기존의 비효율적인 메커니즘을 좀더 개선하고자 개발되고 제안된 것이 위의 Vulkan API이다. 이를 이용하여 앞으로는 보다 효율적인 하드웨어 지향적인 그래픽 프로그래밍이 가능할 것이라 기대한다
책에 관한 본격적인 리뷰에 임하기에 앞서 어떤 사람들에게 본 서를 권하는지 적어보도록 하겠다. 【어떤 독자를 위한 책인가】 본 서는 새로운 그래픽 API 표준에 대해서 설명한 책이다. 따라서 기본적인 그래픽에 관한 지식이 있다면 본 서를 학습함에 있어서 효율을 극대화 할 수 있을 것이라 생각된다. 그렇다고 해서 초보자가 읽기에 무한정으로 어려운 것은 아니다. 다만 기존의 지식이 없다면 몇몇 참고할 도서들을 준비하고 같이 병행해서 학습한다면 충분한 학습효과를 이룰 수 있을 것이라 생각된다. (참고서로는 시중의 기초 그래픽에 관한 도서를 참고하길 권한다.)
【책의 구성】 '처음 만나는 Vulkan' 책의 구성은 어떠한가. CHAPTER 1 차세대 3D 그래픽스 API 시작하기 1.1 Vulkan과 그 진화 과정 1.2 Vulkan vs OpenGL 1.3 알아두어야 할 주요 용어 1.4 Vulkan의 기초 1.5 Vulkan 응용 프로그램의 이해 1.6 Vulkan 프로그래밍 모델 시작하기 1.7 요약 CHAPTER 2 처음 만드는 Vulkan 슈도 프로그램 2.1 Vulkan 설치 2.2 Hello World 슈도 코드 2.3 하나로 맞추기 2.4 요약 CHAPTER 3 장치와 인사하기 3.1 LunarG SDK 시작하기 3.2 CMake로 첫 번째 프로젝트 설정하기 3.3 확장판 소개 3.3.1 레이어와 확장판에 대한 쿼리 3.4 인스턴스 생성 3.5 물리적 장치와 논리적 장치 이해하기 3.6 큐와 큐 패밀리 이해하기 3.7 장치와 큐를 함께 구현하기 3.8 요약 CHAPTER 4 디버깅 4.1 디버깅 맛보기 4.2 LunarG 유효성 검증 레이어와 해당 기능 이해하기 4.3 디버깅 구현 4.4 요약 CHAPTER 5 커맨드 버퍼와 메모리 관리 5.1 커맨드 버퍼 시작하기 5.2 커맨드 풀과 버퍼 API 5.3 커맨드 버퍼의 레코딩 5.4 커맨드 버퍼를 위한 래퍼 클래스 구현 5.5 메모리 관리 5.6 요약 CHAPTER 6 WSI를 이용한 이미지 리소스 할당과 스와프 체인 구축 6.1 이미지 리소스 시작하기 6.2 이미지 리소스 이해하기 6.3 메모리 할당과 이미지 리소스 바인딩 6.4 스와프 체인 소개 6.5 깊이 이미지 생성 6.6 응용 프로그램의 흐름 요약 6.7 요약 CHAPTER 7버퍼 리소스, 렌더 패스, 프레임 버퍼와 SPIR-V 셰이더 7.1 버퍼 리소스의 유형 이해하기 7.2 버퍼 리소스로 기하 데이터 생성하기 7.3 렌더 패스 이해하기 7.4 렌더 패스 사용과 프레임 버퍼 생성하기 7.5 배경색 지우기 7.6 Vulkan에서의 셰이더 작업 7.7 요약 CHAPTER 8 파이프라인과 파이프라인 스테이트 관리 8.1 파이프라인 시작하기 8.2 PCO로 파이프라인 개체 캐싱 8.3 그래픽스 파이프라인 생성 8.4 컴퓨팅 파이프라인 이해 8.5 Vulkan의 파이프라인 스테이트 개체 8.6 파이프라인 구현 8.7 요약 CHAPTER 9 개체 그리기 9.1 Vulkan의 그리기 과정 개요 9.2 드로잉 개체 준비하기 9.3 드로잉 개체의 렌더링 9.4 인덱싱된 기하의 렌더링 9.5 Vulkan의 동기화 프리미티브 이해하기 9.6 디스플레이 윈도의 크기 조정 9.7 요약 CHAPTER 10 디스크립터와 푸시 상수 10.1 디스크립터의 개념 이해하기 10.2 Vulkan에서 유니폼을 구현하는 방법 10.3 푸시 상수 업데이트 10.4 요약 CHAPTER 11 텍스처 그리기 11.1 이미지 리소스의 개요 11.2 텍스처 드로잉을 위한 사전 작업 11.3 선형 타일링으로 이미지 리소스 구현하기 11.4 최적 타일링으로 이미지 리소스 구현하기 11.5 이미지와 버퍼 간 데이터 내용 복사 11.6 디스크립터 세트의 업데이트 11.7 요약 【처음 만나는 Vulkan 을 읽으며…….】 그래픽 프로그래밍은 참으로 어려우면서도 재미있고 심오한 주제이다. 특히 2D-> 3D로 넘어가면 훨씬 더 정교하면서 다양한 수학적 지식과 API를 효과적으로 사용할 수 있는 기술이 프로그래머에게 요구된다. 또한 그중에서도 특히나 중요한 지식이 바로 해당 API가 어떤식으로 동작하고 어떤식으로 명령어를 처리하여 결과를 보이는 지에 대해서 잘 파악하고 있는지이다. 왜냐하면 위의 API를 다중 쓰레드를 이용하여 처리할 때에 다양한 에러가 발생할 수 있고 이렇게 발생한 에러를 효율적으로 디버깅하여 최상의 퍼포먼스를 내기 위해서는 정확한 API 지식과 하드웨어 지식이 뒷받침되어야 하기 때문이다. 따라서 모든 지식과 배움이 그렇겠지만 그래픽을 처음 접하는 입문 프로그래머라면 기초를 충분히 충실히 학습한 후에 다양한 프로젝트에 임할 것을 권한다. 【점수…….】 구성 : ★★★★☆ 내용:★★★☆☆ 디자인: ★★★☆☆ 전문성 : ★★★☆☆ #본 리뷰는 리뷰자 김종욱의 저작권에 귀속되므로 참고시 참고 URL 명시 및 저작자에게 사용 통보를 해 주시기 바랍니다. #본 리뷰의 점수 및 평가 내용은 김종욱 리뷰자의 한정된 것이므로 지극히 주관된 평가 임을 명시합니다. #학습과 관련된 질문과 문제에 대한 질문은 일절 받지 않습니다. 스스로 찾아서 학습하는 것 그것이야 말로 진정한 학습자입니다.
|