게임 화면을 멍하니 바라보고 있으면 가끔 마술 같다는 생각이 듭니다. 하지만 프로그래머의 시선에서는 조금 다르게 보아야 합니다. 이건 마술이 아니라 단계별로 이어지는 계산 과정이니까요. 겉보기엔 하나의 그림 같지만 그 내부는 철저한 수학으로 돌아갑니다.
우리가 보는 장면은 매우 체계적인 절차를 거쳐 색이 결정됩니다. 처음에는 이 개념이 조금 낯설게 느껴질 수 있습니다. 하지만 원리를 알면 그래픽을 다루는 일이 훨씬 흥미로워집니다. 지금부터 그 내부에서 어떤 일이 일어나는지 차근차근 살펴보겠습니다.

세상은 수많은 삼각형으로 이루어져 있습니다
게임 속 세상은 수많은 3D 표면(3D Surface)으로 채워져 있습니다. 이 표면을 만드는 가장 기본 단위는 바로 삼각형입니다. 왜 하필 사각형이나 원이 아닌 삼각형일까요? 삼각형은 어떤 복잡한 모양이라도 안정적으로 표현할 수 있기 때문입니다.
수학적으로 계산하기 가장 빠르고 쉬운 도형이기도 하죠. 부드러워 보이는 캐릭터의 얼굴도 확대해 보면 수많은 삼각형의 집합입니다. 거대한 건물이나 울퉁불퉁한 지형도 마찬가지입니다. 작고 많은 삼각형들이 모여 우리가 보는 형태를 만들어 냅니다.
장면을 담아내는 카메라의 역할
이 장면을 바라보는 기준점은 바로 카메라입니다. 게임 속 카메라는 현실의 카메라를 본떠서 만든 모델입니다. 위치와 바라보는 방향은 물론 초점까지 가지고 있죠. 카메라는 게임 세계 안에서 우리의 눈과 같습니다.
“이 위치에서 저기를 바라보면 화면에 무엇이 잡힐까?” 이 질문에 답하는 것이 카메라의 주된 임무입니다. 카메라의 설정이 조금만 바뀌어도 화면은 완전히 달라집니다. 같은 장면이라도 어디서 보느냐에 따라 전혀 다른 느낌을 주니까요.
빛과 물체가 만나 색이 결정됩니다
형태가 있어도 빛이 없으면 아무것도 볼 수 없습니다. 그래서 광원(Light Source)이 필요합니다. 태양처럼 전체를 환하게 비추거나 램프처럼 은은하게 퍼지기도 합니다. 하지만 빛만으로는 우리가 보는 다채로운 색이 완성되지 않습니다.
각 표면이 빛을 어떻게 반사할지 정하는 규칙이 필요합니다. 금속과 천이 다르게 보이는 이유가 바로 여기에 있습니다. 물체의 재질 속성에 따라 빛은 날카롭게 반사되기도 하고 부드럽게 흩어지기도 합니다. 이 상호작용이 물체의 질감을 결정짓습니다.
모든 정보를 종합하는 렌더러
이 모든 재료를 모아 실제 그림을 그리는 존재가 렌더러(Renderer)입니다. 렌더러는 화면의 점 하나하나마다 색을 채워 넣는 작업을 수행합니다. 개념적으로는 카메라에서 픽셀을 향해 광선을 쏘는 과정을 거칩니다.
광선이 장면의 어디에 부딪히고 어떤 색을 가져올지 계산하죠. 이 계산 결과가 바로 그 픽셀의 최종 색상이 됩니다. 이렇게 수백만 개의 점이 모여 하나의 온전한 프레임을 이룹니다. 이 과정이 쉼 없이 반복되며 화면이 움직입니다.
눈 깜짝할 새보다 빠른 처리 속도
문제는 이 모든 일이 아주 빠르게 일어나야 한다는 점입니다. 실시간 렌더링은 보통 초당 30에서 60프레임을 목표로 합니다. 한 장을 만드는 데 고작 16ms에서 33ms밖에 주어지지 않죠. 이 짧은 시간은 눈 깜짝할 새보다 훨씬 빠릅니다.
그 시간 안에 장면을 업데이트하고 물리 계산과 애니메이션까지 마쳐야 합니다. 영화처럼 시간을 들여 물리적으로 완벽하게 계산할 여유가 없습니다. 시간이 부족하면 화면이 끊기거나 느려지기 십상입니다. 그래서 프로그래머는 항상 시간과의 싸움을 벌입니다.
현실과 타협하며 최선의 결과를 쫓다
이런 제약 때문에 실시간 엔진은 근사치(Approximation)를 적극적으로 활용합니다. 완벽한 물리 법칙을 따르는 대신 눈에 그럴듯해 보이는 방식을 택합니다. 계산량은 대폭 줄이되 품질은 최대한 유지하는 똑똑한 전략이죠. 물리 기반 개념을 쓰되 적절한 타협을 섞습니다.
제한된 자원 안에서 가장 보기 좋은 화면을 만들어 내는 것이 중요합니다. 이것이 바로 실시간 그래픽을 지탱하는 힘입니다. 수많은 최적화 기술이 이 짧은 시간 안에 아름다운 세상을 그려내고 있습니다.