정보기술 · 인공지능 ·
GPU 기반 벡터 그래픽 렌더링, 처리 속도 10배 이상 향상...소프트웨어 개발자 아우리마스 가시울리스 새로운 접근법 제시
GPU 활용한 벡터 그래픽 렌더링 기법으로 기존 CPU 방식 대비 10~15배 빠른 성능 구현
[한국정보기술신문] 벡터 그래픽 렌더링을 GPU에서 수행하는 새로운 접근법이 제시되면서 그래픽 처리 성능을 획기적으로 개선할 수 있는 가능성이 열렸다. 소프트웨어 개발자 아우리마스 가시울리스는 자신의 블로그를 통해 GPU를 활용한 벡터 그래픽 렌더링 알고리즘을 공개하며, 기존 CPU 기반 방식보다 10배에서 15배 빠른 성능을 달성했다고 밝혔다.
벡터 그래픽은 화면이 연결된 모든 컴퓨터에서 사용되고 있지만, 대부분의 렌더링 작업은 여전히 CPU에서 처리되고 있다. 가시울리스는 이러한 현실이 잘못되었다고 지적하며, GPU의 병렬 처리 능력을 활용해야 한다고 주장했다. 애플 M1 GPU의 경우 24,576개의 스레드를 동시에 실행할 수 있어, 벡터 그래픽 렌더링에 적합한 환경을 제공한다.
와인딩 넘버를 활용한 기본 래스터화
가시울리스가 제시한 알고리즘은 와인딩 넘버라는 개념을 핵심으로 한다. 와인딩 넘버는 픽셀 중심이 도형 내부에 있는지 외부에 있는지를 나타내는 정수 값이다. 픽셀 행의 중심을 가로지르는 가상의 수평선을 그었을 때, 위로 향하는 선분과 만나면 와인딩 넘버가 1 증가하고, 아래로 향하는 선분과 만나면 1 감소한다. 최종적으로 와인딩 넘버가 0이 아닌 픽셀은 색상으로 채워진다.
이 방식을 GPU에서 구현하기 위해서는 각 픽셀을 독립적으로 처리할 수 있도록 알고리즘을 수정해야 한다. 각 픽셀에 대해 도형의 모든 선분을 검사하고, 픽셀 중심 왼쪽에 있는 교차점만 고려하면 된다. 선분을 처리하는 순서는 중요하지 않아 병렬 처리에 적합하다.
분석적 안티앨리어싱으로 품질 향상
단순한 래스터화는 1995년 수준의 거친 가장자리를 만든다. 가시울리스는 슈퍼샘플링 방식이 16배의 메모리와 처리 시간을 요구하는 비효율적인 방법이라고 지적하며, 분석적 안티앨리어싱을 대안으로 제시했다. 이 방식은 속도 저하가 거의 없으면서도 슈퍼샘플링보다 훨씬 우수한 품질을 제공한다.
분석적 안티앨리어싱은 각 선분에 대해 면적과 커버 값을 계산한다. 면적 값은 픽셀 내부에서 선분의 오른쪽 영역을 나타내고, 커버 값은 픽셀 왼쪽에 있는 선분 부분의 높이를 나타낸다. 모든 선분의 면적과 커버 값을 누적한 후 채우기 규칙에 따라 최종 불투명도로 변환한다. 이 알고리즘은 FreeType과 LibArt에서 영감을 받았으며, 현재 대부분의 컴퓨터에서 사용되고 있다.
블록 분할을 통한 성능 최적화
도형이 많아질수록 각 픽셀에서 처리해야 할 선분의 수가 증가해 성능이 저하된다. 가시울리스는 화면을 32x32 픽셀 크기의 고정된 블록으로 나누는 방식으로 이 문제를 해결했다. 각 블록은 해당 영역과 교차하는 도형의 선분 목록과 커버 테이블을 포함한다.
커버 테이블은 블록 왼쪽에 있는 모든 블록의 커버 정보를 담고 있어, 현재 블록 내의 선분만으로는 알 수 없는 픽셀 커버리지 정보를 제공한다. 블록 준비는 CPU에서 수행되며, 실제 렌더링은 GPU에서 병렬로 처리된다. 이러한 하이브리드 접근 방식은 단순성과 성능의 균형을 맞춘다.
CPU-GPU 하이브리드 접근법의 장점
가시울리스는 블록 준비를 CPU에서 수행하는 이유에 대해 설명했다. piet-gpu와 같은 프로젝트는 모든 작업을 GPU에서 수행하려 하지만, 이는 고급 GPU 컴퓨팅 기능을 필요로 한다. 반면 블록을 CPU에서 준비하는 방식은 단 하나의 GPU 커널 디스패치만 필요하며, 단색으로 도형을 렌더링하는 가장 간단한 커널도 약 80줄의 코드에 불과하다.
CPU에서의 블록 준비 과정은 충분히 최적화되었고 메모리 할당이 예측 가능하다. 가시울리스는 이러한 균형 잡힌 접근 방식이 수정과 확장이 쉽다는 장점을 가진다고 설명했다.
세그먼트 인코딩과 SIMD 최적화
가시울리스의 구현에서는 선분을 8.8 고정 소수점 숫자로 인코딩한다. 블록 크기가 32x32 픽셀이므로, 8.8 고정 소수점은 256분의 1 픽셀 정밀도로 선을 표현하기에 충분하다. 이 인코딩 방식을 사용하면 하나의 선분을 64비트로 표현할 수 있어 메모리 효율이 높다.
SIMD 그룹 구성도 성능에 중요한 영향을 미친다. 셰이더 내에서 X축으로 선분을 거부하려 하면 SIMD 그룹 내에서 코드 경로가 분기되어 실행 시간이 증가할 수 있다. 따라서 Y축으로만 선분을 거부하는 것이 좋은 성능 최적화 방법이다. 스레드 그룹 크기를 SIMD 그룹 너비와 동일하게 선택하면 SIMD 그룹이 1행의 픽셀만 처리하게 되어 효율적이다.
다른 연구와의 비교
가시울리스는 자신의 작업이 여러 기존 프로젝트에서 영감을 받았다고 밝혔다. piet-metal은 GPU에서 벡터 그래픽을 렌더링하려는 주요 동기였으며, piet-gpu는 도형을 개별 선분으로 평탄화하는 작업까지 GPU에서 수행하려는 차세대 개념을 보여준다. Efficient GPU Path Rendering Using Scanline Rasterization 논문도 흥미롭지만 접두사 합 계산과 정렬을 필요로 해 복잡하다.
Pathfinder는 가시울리스가 설명한 방식과 유사한 것으로 보이지만 정확한 작동 방식은 파악하지 못했다. 게임용 확장 가능한 텍스트 렌더링에 인기 있는 Slug 라이브러리는 특허가 등록된 알고리즘을 사용한다.
실용적 성능과 향후 전망
가시울리스는 정확한 밀리초 단위 비교가 무의미하다고 전제하면서도, 동일한 입력을 고도로 최적화된 소프트웨어 렌더러와 비교했을 때 GPU 지원 버전이 10배에서 15배 빠르다고 밝혔다. 특히 이미지 채우기에서 가장 큰 성능 향상을 보였다. 블렌딩, 채울 픽셀 찾기, 채우기 색상 계산 등 벡터 그래픽 렌더링의 가장 비용이 많이 드는 요소들이 이미 GPU에서 실행되고 있어 효율적이다.
이미지를 사용한 도형 채우기에서 쌍선형 필터를 사용하면 비용이 매우 높아질 수 있으며, 방사형 그래디언트도 CPU에서 처리하기에 부담스러울 수 있다. 가시울리스는 GPU에 렌더링의 일부 단계를 맡기는 이 접근 방식이 매우 마음에 든다고 평가하며, 좋은 출발점이라고 결론지었다.
한국정보기술신문 정보기술분과 전호재 기자 news@kitpa.org