쉐이더: 퐁 반사 모델 — 하이라이트의 수학
공에 맺힌 반짝이는 점, 본 적 있나요?
매끈한 사과를 형광등 아래에 두면 한 곳이 유난히 하얗게 반짝입니다. 당구공도 그렇고, 숟가락도 그렇습니다. 이 반짝이는 점을 하이라이트라고 부릅니다.
그런데 컴퓨터 속 3D 사과는 원래 그냥 숫자 덩어리입니다. 반짝임 같은 건 없습니다. 그래서 옛날 그래픽 연구자들이 고민했습니다. "저 반짝임을 계산으로 흉내 낼 수 없을까?"
1975년, 부이 뜨엉 퐁(Bui Tuong Phong)이라는 연구자가 답을 내놓았습니다. 그게 오늘 이야기할 퐁 반사 모델입니다. 50년이 지난 지금도 그래픽 교과서 첫 장에 나오는 유명한 방법입니다.
빛을 세 조각으로 나누기

퐁의 아이디어는 간단합니다. 물체에 닿는 빛을 세 조각으로 나눠서 따로 계산한 뒤, 마지막에 더하는 겁니다.
첫째, 주변광(앰비언트). 방에 불을 켜면 책상 밑 그늘도 완전히 캄캄하지는 않지요? 빛이 벽과 천장에 튕겨 다니며 온 방을 은은하게 채우기 때문입니다. 이걸 일일이 계산하면 너무 힘드니, 퐁 모델은 그냥 "모든 곳에 기본 밝기를 조금씩 깔아 두자"라고 정합니다.
둘째, 난반사(디퓨즈). 물체의 "몸통 색"입니다. 빛을 정면으로 받는 쪽은 밝고, 비스듬히 받는 쪽은 어둡습니다. 손전등을 종이에 똑바로 비출 때와 눕혀서 비출 때 밝기가 다른 것과 같습니다. 이 부분 덕분에 공이 둥글게 보입니다.
셋째, 정반사(스페큘러). 오늘의 주인공, 바로 그 반짝이는 하이라이트입니다. 거울처럼 빛이 한 방향으로 튕겨 나가는 부분입니다.
위 그림을 보세요. 세 조각을 각각 그린 다음 더하니, 오른쪽 끝에 제법 진짜 같은 물체가 나타납니다. 복잡한 문제를 쉬운 문제 셋으로 쪼갠 것, 이게 퐁 모델의 핵심입니다.
하이라이트의 비밀: 빛은 어디로 튕길까

이제 하이라이트를 계산하는 방법을 볼 차례입니다. 준비물은 화살표 네 개입니다. 그래픽에서는 이런 방향 화살표를 벡터라고 부릅니다.
화살표 네 개는 이렇습니다.
- L — 표면에서 빛(전구) 쪽을 가리키는 화살표
- N — 표면이 정면으로 향한 쪽. "법선"이라고 부릅니다
- R — 빛이 표면에 부딪혀 튕겨 나가는 쪽
- V — 표면에서 내 눈 쪽을 가리키는 화살표
공을 벽에 던지면 비스듬히 튕겨 나가지요? 빛도 똑같습니다. 들어온 각도만큼 반대쪽으로 튕깁니다. 그게 R입니다.
이제 규칙은 딱 하나입니다. 튕겨 나가는 방향(R)과 내 눈 방향(V)이 얼마나 비슷한가? 거의 같으면 튕긴 빛이 내 눈으로 곧장 들어오니 눈부시게 반짝입니다. 방향이 어긋나면 반짝임은 금방 사라집니다. 그래서 고개를 조금만 움직여도 하이라이트가 미끄러지듯 자리를 옮기는 겁니다.
매끈한 정도를 숫자 하나로: 반짝임 지수
그런데 유리구슬과 고무공은 반짝임이 다릅니다. 유리구슬은 작고 또렷한 점, 고무공은 넓고 흐릿한 얼룩입니다. 퐁 모델은 이 차이를 숫자 하나로 조절합니다. 바로 반짝임 지수(영어로 shininess)입니다.
계산은 이렇습니다. R과 V가 비슷한 정도를 0에서 1 사이 숫자로 구한 다음, 그 숫자를 반짝임 지수만큼 거듭제곱합니다. 0.9를 두 번 곱하면 0.81, 열 번 곱하면 약 0.35, 백 번 곱하면 거의 0이 됩니다. 1보다 작은 수는 곱할수록 빠르게 작아지니까요.
그래서 지수를 크게 하면 "방향이 아주 정확히 맞을 때만" 밝게 남고, 나머지는 순식간에 어두워집니다. 결과는 작고 날카로운 하이라이트, 즉 유리 느낌입니다. 지수를 작게 하면 대충 비슷한 방향도 밝게 남아서 넓고 부드러운 하이라이트, 즉 고무 느낌이 됩니다. 숫자 하나 바꿨을 뿐인데 재질이 달라 보입니다. 이게 퐁 모델에서 제일 재미있는 부분입니다.
직접 써 보면 어떨까
쓸 때 좋은 점. 일단 정말 쉽습니다. 셰이더를 처음 배우는 사람이 몇 줄 적으면 화면 속 공이 바로 반짝입니다. 이 "바로 보이는" 경험이 주는 힘이 큽니다. 계산도 가벼워서 오래된 컴퓨터나 간단한 모바일 게임에서도 잘 돌아갑니다. 반짝임 지수 숫자를 슬라이더로 밀면서 재질이 변하는 걸 눈으로 확인하는 재미도 있습니다.
쓸 때 힘든 점. 진짜 같지는 않습니다. 특히 금속을 만들려고 하면 애를 먹습니다. 숫자를 아무리 만져도 어딘가 플라스틱 장난감처럼 보여서, "왜 내 칼은 은색이 아니라 회색 비누 같지?" 하고 한참 헤매게 됩니다. 퐁 모델은 실제 물리 법칙이 아니라 "그럴듯해 보이게" 만든 눈속임이라, 에너지가 실제보다 많아지는 등 물리적으로 맞지 않는 구석이 있습니다. 또 빛을 비스듬히 볼 때 R을 구하는 계산이 이상하게 끊기는 문제가 있어서, 실무에서는 R 대신 다른 화살표(중간 벡터)를 쓰는 블린-퐁이라는 개량판으로 갈아타는 경우가 많습니다. 요즘 게임 엔진들이 물리 기반 렌더링(PBR)으로 넘어간 것도 이런 한계 때문입니다.
정리하며
퐁 반사 모델을 한 문장으로 줄이면 이렇습니다. "빛을 세 조각(주변광, 난반사, 정반사)으로 나눠 더하고, 반짝임은 튕긴 방향과 눈 방향이 얼마나 비슷한지로 정한다."
오늘날 최신 그래픽은 더 정교한 방법을 쓰지만, 그 방법들도 결국 퐁이 깔아 놓은 길 위에 서 있습니다. 빛을 성분으로 나누고, 화살표 사이 각도로 밝기를 정한다는 생각은 지금도 그대로거든요. 셰이더 공부를 시작한다면, 이 오래된 반짝임부터 만들어 보는 게 가장 좋은 첫걸음입니다.
출처
리깅 파이프라인 자동화 도구
반복 작업은 스크립트에게. 현업에서 쓰는 리깅 툴 모음.
리깅 도구 보기