원문 캡처 · blog.jacobstechtavern.com
원문 캡처 · blog.jacobstechtavern.com

제이콥 바틀릿(Jacob Bartlett)은 SwiftUI와 Metal 셰이더로 만델브로 집합을 그리고, 화면을 드래그하거나 핀치해 확대·이동하는 앱을 만드는 과정을 소개한다. 튜토리얼은 SwiftUI 코드 51줄과 Metal 코드 39줄로 구성되며, 마지막에는 기본 구현의 정밀도 한계와 이를 보완한 앱 기능도 설명한다.

만델브로 집합은 복소수에 반복 계산을 적용해 그린다. Metal을 사용하면 GPU가 화면의 픽셀을 병렬로 계산할 수 있다. 글은 셰이더에 픽셀 좌표와 뷰의 경계를 전달하는 데서 출발해, 반복 횟수 조절과 색상 적용, 화면 이동과 핀치 확대를 차례로 구현한다. 색상은 각 지점의 계산이 집합 밖으로 벗어나는 데 걸린 반복 횟수에 따라 정한다.

기본 구현은 반복 횟수를 256으로 설정하고 확대 범위를 가로 기준 5.5에서 0.00001까지로 제한한다. 바틀릿은 이보다 더 확대하면 float32 정밀도로 인해 이웃한 픽셀이 같은 복소수로 반올림돼 화면이 블록처럼 보인다고 설명한다. 임의 정밀도의 더 깊은 확대에는 섭동법(perturbation) 같은 추가 기법이 필요하다.

바틀릿은 이후 앱을 다듬으며 UIKit의 스크롤 뷰로 제스처 처리와 화면 그리기를 분리하고, 저장된 확대 지점과 색상 팔레트, 자동 확대, 계산 결과 캐싱 등을 추가했다고 밝혔다. 그는 앱의 확대 배율을 10¹⁰⁰⁰⁰배로 소개하지만, 이는 글에서 제시한 앱의 표기다. 앱은 Ultra Mandelbrot에서 내려받을 수 있으며, 글은 섭동법 설명과 SwiftUI의 제스처 상태 문서를 참고 자료로 연결한다.