전체 프로젝트로 돌아가기

LETSPETS / PROJECT 01

유리 카메라

눈앞의 장면을 패턴 유리 너머로 보는 iPhone 카메라

심사가 끝나면 이 자리에 App Store 링크를 답니다. 개인정보 처리 방침은 이 사이트의 처리방침 페이지에서 볼 수 있습니다.

쿼드라 패턴 유리 너머로 피사체가 굴절돼 보이는 미리보기 화면
최신 버전1.0
심사 상태대기 중
플랫폼iPhone
유리 패턴3

촬영한 뒤에 씌우는 필터가 아닙니다. 빛이 공기에서 유리로, 다시 공기로 꺾이는 굴절을 매 프레임 계산해 미리보기에 그립니다. 그래서 유리를 조금 두껍게 하거나 셀을 조금 키우면 장면이 통째로 달라지고, 화면에 보이는 그대로 사진과 동영상이 됩니다. 계산은 아이폰의 GPU에서 끝나고 계정도 네트워크도 필요 없습니다. SwiftUI와 AVFoundation, Metal로 만들었고 외부 패키지를 하나도 쓰지 않습니다.

01

굴절을 계산한다

셀마다 높이가 이어지는 유리판을 세우고, 공기에서 유리로 들어갔다 나오는 두 번의 굴절을 스넬 법칙으로 푼다. 경계의 반사량은 프레넬 식으로 구한다. 평균색 모자이크나 그려 넣은 격자가 아니다.

02

패턴 세 가지

넓은 사각 면이 부드럽게 이어지는 쿼드라, 굵은 십자 리브가 규칙적으로 지나가는 Cross Large, 대각선 면이 장면을 비스듬히 자르는 다이아몬드. 패턴을 바꿔도 맞춰 둔 다이얼 값은 그대로 둔다.

03

반원 다이얼

셀 크기, 굴곡, 모서리 둥글기, 두께, 경계 굴곡, 반사 밝기를 손끝으로 돌려 맞춘다. 조절 영역이 미리보기 아래에 있어 피사체를 가리지 않는다. 값은 저장되고 전체 초기화 한 번으로 처음으로 돌아간다.

04

원본과 나란히

원본 버튼을 누르면 유리 없는 장면이 바로 나온다. 두 번 눌러 무엇이 달라졌는지 확인한다.

05

동영상도 같은 유리로

1080×1440 H.264로 녹화하면서 패턴과 다이얼을 바꿀 수 있고, 바뀌는 과정이 그대로 영상에 담긴다. 마이크를 허용하면 소리도 함께 들어간다.

06

찍은 값을 기록한다

셔터는 마지막으로 제출된 재질 상태를 찍는다. 이후 다이얼을 움직여도 이미 찍은 사진은 변하지 않는다. 쓴 재질과 해시, 추정 형상, 반사 조명이 합성이라는 사실을 JPEG 메타데이터에 남긴다.

MAKING NOTES

The little details.

첫 후보는 유리 버튼처럼 보였다

처음 계획은 초타원 렌즈알을 격자로 까는 것이었는데, 처음 렌더한 결과가 부풀린 유리 단추 같았다. 셀마다 따로 놓는 대신 높이가 이어지는 한 장의 판으로 바꾸고 나서야 참고 사진의 결이 나왔다.

셀 경계에서 그림이 찢어졌다

셀마다 기울기를 따로 구하면 맞닿는 선에서 상이 어긋난다. 이웃한 셀이 경계의 기울기를 공유하게 하고 밉맵을 비등방으로 걸어, 넓은 면은 남기고 이음매만 눌렀다.

미리보기와 촬영이 같은 코드로 돈다

미리보기용과 저장용 셰이더를 따로 두면 둘이 어긋나는 날이 온다. 하나로 합치고, 미리보기는 GPU 명령을 한 번에 하나만 띄워 프레임이 밀리지 않게 했다. 재질을 바꿔도 셰이더를 다시 컴파일하지 않는다.

저장 실패를 촬영 실패로 만들지 않는다

결과물을 먼저 앱 안에 원자적으로 쓰고 나서 사진 보관함에 넣는다. 보관함 쪽이 실패해도 방금 찍은 것은 남아 있고, 다시 저장하거나 공유할 수 있다.

녹화 중에도 값을 바꾼다

다이얼을 돌리면 그 시점부터 인코딩되는 프레임에 바로 반영된다. 열이나 부하로 프레임을 흘리더라도 촬영 시각은 유지해 영상 길이가 어긋나지 않게 했다.

스크린샷은 테스트가 뽑는다

스토어용 여섯 장은 UI 테스트를 시뮬레이터에서 돌려 만든다. 상태바를 9:41로 고정하고 샘플 사진을 띄운 뒤 1320×2868로 내보낸다. 이 페이지의 화면들도 같은 경로에서 나왔다.

사용 전에 확인해 주세요

  • App Store 심사 대기 중입니다. 1.0 버전을 한국어·영어·일본어 세 언어로 올려 둔 상태라 아직 받을 수 있는 링크가 없습니다.
  • iPhone 전용이며 iOS 17 이상과 카메라가 필요합니다. 카메라를 허용하지 않으면 앱에 들어 있는 샘플 사진으로 효과를 볼 수 있습니다.
  • 촬영 화면은 세로 3:4로 고정입니다. 가로 모드는 지원하지 않습니다. 불러온 사진은 원래 비율을 유지합니다.
  • 장면까지의 거리를 1.2m로 고정하고 화각은 추정값을 씁니다. 가려진 부분을 복원하거나 실제 조명을 읽지는 않으며, 반사는 가상 실내 조명입니다.
  • 실물 유리를 재어 만든 수치가 아닙니다. 여러 거리에서 찍은 실물 대조, 광학 해상력 측정, 장시간 발열 시험은 아직 남아 있습니다.
  • 동영상은 앱이 화면에 있는 동안만 녹화합니다. 앱이 내려가면 그때까지 찍은 분량으로 마무리합니다. 30fps는 목표이고 발열 상황에서 보장되는 값은 아닙니다.
  • 샘플 고양이 사진은 Wikimedia Commons의 Orange Tabby Cat sitting on a couch(LauraDelga, CC BY 4.0)를 잘라 쓴 것입니다.
  • 저장소가 비공개라 소스 코드 링크를 제공하지 않습니다.
NEXT LITTLE THING모아