컴퓨터 그래픽스 용어 및 설명
렌더링 파이프라인
렌더링 파이프라인은 3D 데이터를 모니터에 뿌려질 2D 픽셀로 만드는 과정이다.
애플리케이션 단계, 기하 단계, 래스터화 단계, 픽셀 단계로 4가지가 있다.
- 애플리케이션 단계(Application Stage)
- CPU가 명령을 내리는 단계.
- 주요 작업: 드로우콜(Draw Call) 준비, 충돌 감지, 가시성 판단(화면에 안 보이는 물체 거르기).
- 결과물: 이 정점(Vertex) 데이터들을 이런 설정으로 그리라는 명령이 GPU로 넘어간다.
- CPU가 명령을 내리는 단계.
- 기하 단계 (Geometry Stage)
- 여기서부터는 GPU가 주도하며, 3D 공간 상의 계산이 이뤄지는 단계.
- 정점 셰이더(Vertex Shader): 3D 모델의 각 점(정점) 위치를 계산한다. (회전, 이동, 크기 조절 등)
- 좌표계 변환: 로컬 좌표 → 월드 좌표 → 카메라 좌표 → 투영 좌표로 변환하여 3D 공간을 카메라 시점으로 평면화한다.
- 클리핑(Clipping): 카메라 화면 밖으로 나가는 삼각형 부분을 잘라낸다.
- 여기서부터는 GPU가 주도하며, 3D 공간 상의 계산이 이뤄지는 단계.
- 래스터화 단계 (Rasterization Stage)
- 수학적 데이터가 픽셀로 변환되는 단계.
- 3D 삼각형이 차지하는 영역에 해당하는 모니터상의 픽셀들을 찾아낸다.
- 이 과정을 거치면 '점들의 모임'이 '픽셀(Fragment) 조각들의 모임'이 된다.
- 수학적 데이터가 픽셀로 변환되는 단계.
- 픽셀 단계 (Pixel/Fragment Stage)
- 최종적으로 화면에 보일 색상을 결정하는 단계.
- 픽셀 셰이더(Pixel/Fragment Shader): 조명(Lighting), 텍스처(Texture), 그림자 등을 계산하여 각 픽셀의 최종 색을 칠한다.
- 출력 병합(Output Merger): 반투명 처리(Alpha Blending)나 깊이 테스트(Z-Test)를 통해 어떤 물체가 앞에 보일지 결정하고 최종 프레임 버퍼에 기록한다.
- 최종적으로 화면에 보일 색상을 결정하는 단계.
오브젝트 풀링(Object Pooling)
- 개념
- 오브젝트 풀링은 객체를 매번 새로 만들고 파괴하는 대신, 미리 만들어준 객체들을 재사용하여 컴퓨터의 자원을 아끼는 소프트웨어 디자인 패턴이다. 특히 게임 개발처럼 짦은 시간 안에 수많은 객체(총알, 파티클 등)이 생성되고 사라지는 환경에서 필수적이다.
- 사용하는 이유
- 컴퓨터 메모리 관련 측면에서 객체를 new로 생성하고 파괴하는 과정은 비용이 상당하다.
- 메모리 파편화: 객체를 새로 생성하고 지우면 메모리 공간이 조각난다.
- 가비지 컬렉션 부하: 사용하지 않는 객체가 쌓이면 가비지 컬렉터가 작동하는데, 이때 게임이 순간적으로 멈추는 현상이 발생
- 수명이 짧고 동시에 많이 나타나는 객체에 사용하는 것이 적합하다.
- 컴퓨터 메모리 관련 측면에서 객체를 new로 생성하고 파괴하는 과정은 비용이 상당하다.
- 작동 원리
- 풀 생성: 게임 시작 시 필요한 객체를 미리 만들어 풀이라는 바구니에 담아둔다. 이때, 객체들은 모두 비활성 상태다.
- 대여: 객체가 필요하면 새로 만드는 게 아니라, 풀에서 비활성화된 객체 하나를 꺼내 활성화시키고 사용한다.
- 반납: 객체가 사라져야하면 파괴하는 대신, 비활성화로 전환한다.
- 주의할 점
- 꺼낼 때 반드시 데이터를 초기화해야한다.
- 풀 크기를 잘 조절해야한다.
오클루전(Occlusion)
- 개념
- 오클루전은 한 객체가 다른 객체에 의해 가려지는 현상을 뜻한다. 이 가려짐을 이용해 그래픽의 사실감을 높이거나 연산량을 줄이는 기술들을 통칭하기도 한다.
- 대표적인 오클루전
- 앰비언트 오클루전
- 구석진 곳이나 틈새에 생기는 부드러운 그림자
- 오클루전 컬링
- 카메라 시야 안에 있더라도, 커다란 벽이나 건물 뒤에 숨어서 플레이어 눈에 보이지 않는 개체들은 렌더링하지 않는 성능 최적화 기술
- 오디오 오클루전
- 캐릭터와 소리 발생원 사이에 장애물이 있을 때, 소리가 먹먹하게 들리거나 작아지는 현상 시뮬레이션
- 앰비언트 오클루전
FPS
- 개념
- Frame Per Second. 매초당 프레임 속도를 의미한다.
- FPS를 결정하는 3요소
- CPU: 게임의 물리 연산, AI의 움직임, 드로우 콜을 담당. CPU가 바쁘면 GPU에 명령을 내리지 못해 FPS가 떨어진다.
- GPU: 렌더링 파이프라인을 돌려 실제 색상을 칠함. 해상도가 높거나 화려한 효과가 많을 수록 GPU 연산 시간이 길어져 FPS가 떨어진다.
- VRAM/ RAM: 재료를 불러오는 속도가 느리면 연산 장치들이 놀게 되어 FPS가 불규칙해진다.
- 프레임 타임(Frame Time)
- 평균 60FPS를 목표로 하며, 모든 프레임은 1초의 60분의 1인 16.6ms 이하의 시간에 계산되어야 프레임 드랍이 없다.
V-Sync(수직 동기화)
- 개념
- 그래픽 카드의 프레임 생성 속도와 모니터 화면 갱신 속도를 일치시키는 기술
- 그래픽카드는 1초에 100프레임을 그리는데, 모니터는 초당 60번(60Hz)만 화면을 바꿀 수 있을 때 모니터가 첫번째 이미지를 다 그리기 전에 두 번째 그림이 들어오므로, 화면이 어긋나보이는 현상이 발생.
- 작동 원리
- V-Sync는 그래픽 카드에 프레임을 다 그려도 모니터가 다음 화면을 그릴 준비가 되지 않았으면 기다린다.
- 게임의 FPS를 모니터 주사율과 똑같이 고정한다.
- 단점
- 그래픽카드가 계산을 끝냈어도 모니터 신호를 기다리느라 화면 출력을 지연시켜, 입력이 화면에 반영되는 속도가 느려진다.
- 그래픽카드가 60FPS에서 59FPS가 되는 순간, V-Sync는 다음 동기화 타이밍을 기다리느라 화면을 30FPS로 내려버리는 경우가 있다. 이렇게 되면 화면이 끊기는 느낌을 준다.
LOD/HLOD
- 개념
- LOD(Level of Detail)
- 카메라와의 거리에 따라 오브젝트의 정밀도를 단계적으로 조절하는 최적화 기술이다
- HLOD(Hierarchical Level of Detail)
- 계층적 LOD라는 뜻으로, 개별 물체가 아니라 여러 개의 물체를 하나로 묶어서 LOD를 관리하는 더 고차원적인 기술이다.
- CPU가 GPU에게 그래픽을 구현하라고 내리는 명령을 드로우 콜이라고 하는데, 일반 LOD의 경우에는 폴리곤 수가 줄어들지만 드로우 콜 횟수는 그대로다. HLOD는 드로우 콜 횟수 자체를 줄인다.
- 가까운 물체는 세밀하게, 멀리 있는 물체는 단순한 모양으로 바꿔서 그래픽 카드 부담을 줄여준다.
- LOD(Level of Detail)
- 작동 원리
- LOD는 하나의 모델을 여러 버전으로 준비하여 거리에 따라 폴리곤 수를 조절한다.
- LOD 0(High Poly): 카메라 바로 앞에 있을 때, 모든 디테일이 살아있는 원본 모델
- LOD 1(Mid Poly): 조금 멀어졌을 때. 폴리곤 수를 50% 정도 줄인 모델.
- LOD 2(Low Poly): 아주 멀리 있을 때. 실루엣만 알아볼 수 있을 정도로 단순화된 모델.
- Culling: 너무 멀어서 점처럼 보일 때는 아예 화면에서 지워버린다.
- HLOD는 카메라가 멀어지면 미리 계산해둔 HLOD 데이터를 불러온다.
- 클러스터링: 가까이 모여있는 오브젝트들을 하나의 그룹으로 묶는다.
- 메시 병합: 그룹 내의 모든 3D 모양을 하나의 커다란 덩어리로 합친다.
- 텍스처 베이킹: 여러 장의 텍스처를 한 장의 커다란 지도로 합쳐서 메모리 효율을 높인다.
- 대체: 카메라가 일정 거리 이상 멀어지면 원래의 개별 오브젝트들을 지우고, 합쳐진 덩어리 하나만 보여준다.
- LOD는 하나의 모델을 여러 버전으로 준비하여 거리에 따라 폴리곤 수를 조절한다.
- 장점
- 렌더링 성능 향상: 폴리곤 총 개수가 줄어들어 프레임 속도(FPS)가 올라간다.
- 메모리 관리: 멀리 있는 물체는 텍스처 해상도도 낮추어 비디오 메모리(V RAM)을 아낄 수 있다.
- 방대한 맵 구현: 오픈월드 게임처럼 수많은 객체를 동시에 보여주는 환경에서는 필수다.
- 부작용
- Pop-in 현상: 카메라가 이동할 때 모델이 갑자기 바뀌어 몰입감을 해칠 수 있다.
- LOD Crossfade: 모델이 바뀔 때 한번에 바뀌지 않고, 투명도를 조절하여 점진적으로 겹쳐지게끔(Dithering) 함으로써 해결한다.
- 언리얼 엔진에서 활용
- 나나이트: 엔진이 실시간으로 픽셀 단위의 LOD를 자동 조절한다.
- 월드 파티션(World Partition): 맵이 너무 크면 구역을 나눠서 필요한 부분만 로드하고, 먼 곳은 HLOD로 대체하는 기능을 자동 수행한다.
- 프록시 메시(Proxy Mesh): 복잡한 건물 내부까지 렌더링할 필요가 없을 때, 겉모양만 따낸 껍데기 메시를 HLOD로 사용한다.
포스트 프로세싱
- 개념
- 이미 렌더링된 최종 화면에 추가적인 효과를 덧입혀서 시각적 완성도를 높이는 작업.
- 작동원리
- 이미지 생성: 카메라가 3D 장면을 계산하여 한 장의 2D 이미지(버퍼)로 만든다.
- 필터 적용: 생성된 이미지의 각 픽셀을 분석하여 색감을 조정하거나, 번짐 효과를 주거나, 외곽선을 그린다.
- 최종 출력: 모든 효과가 입혀진 화면이 유저의 모니터에 표시된다.
- 예시
- 블룸(Bloom): 강한 빛이 카메라 렌즈에 번지는 효과를 준다.
- 뎁스 오브 필드(Depth of Field): 초점이 맞는 곳은 선명하게, 나머지는 흐릿하게 처리한다.
- 컬러 그레이딩(Color Grading): 화면의 전반적인 색감이나 대비 조절을 한다.
- 모션 블러(Motion Blur): 카메라나 물체가 빠르게 움직일 때 잔상을 남겨 속도감을 더한다.
- 비네팅(Vignetting): 화면의 가장자리를 어둡게 처리하여 중앙으로 시선을 집중시킨다.
- 안티 앨리어싱(Anti-Aliasing): 계단 현상을 제거한다.
- 장점
- 3D 화면의 분위기를 개선하여 영화같은 느낌을 줄 수 있다.
- 모델링이나 텍스처의 일관된 톤을 유지할 수 있다.
- 단점
- 효과가 겹칠수록 GPU 점유율이 올라가 프레임이 떨어진다.
- 과도한 효과는 플레이어의 시야를 방해하고 눈의 피로를 유발한다.
볼류메트릭 포그
- 개념
- 안개를 배경 이미지가 아닌, 빛과 상호작용하는 부피를 가진 실체로 계산하는 그래픽 기술
- 작동 원리
- 3D 공간을 작은 격자(Voxel) 단위로 나누고, 각 칸에 안개 입자가 얼마나 있는지 계산한다.
- 빛이 안개를 뚫고 지나갈 때 생기는 빛줄기가 실시간으로 구현된다.
- 특징
- 빛의 산란: 손전등을 비추면 빛이 나아가는 경로가 안개에 반사되어 눈에 보임
- 그림자 수용: 안개 자체가 그림자의 영향을 받는다.
- 밀도 변화: 특정 구역은 안개를 짙게, 다른 구역은 얕게 설정할 수 있다.
- 단점
- 3D 공간의 부피를 계산해야하므로 그래픽 카드에 부담이 크다.
- 계산 횟수를 줄이면 노이즈가 보일 수 있다. 보통 포스트 프로세싱과 섞어 부드럽게 만든다.
- 엔진에서 활용
- 언리얼: Exponential Height Fog 컴포넌트 내의 Volumetric Fog 체크박스를 켜면 활성화
- 유니티: HDRP(High Definition Render Pipeline) 환경에서 Volume 시스템을 통해 제어
자연환경에서 발자국 데칼과 형태 변형의 차이
게임에서 모래나 눈 위를 걸을 때 발자국이 남는 경우가 있다. 이러한 효과를 줄 때 위에 이미지만 찍거나, 실제로 변형이 일어나는 경우가 있는데 두 가지를 간단히 비교해보도록 하겠다.


데칼(Decal)
- 데칼은 캐릭터가 발을 내딛을 때, 지형 위에 발자국 모양의 2D 이미지를 투영하는 방식이다.
- 장점
- 사양이 매우 낮아 성능에 무리를 주지 않는다.
- 단점
- 입체적인 상호작용은 불가능하다.
- 패럴랙스 매핑(Parallax Mapping): 텍스처의 착시를 이용해 깊이감이 있는 것처럼 보이게 하는 기법. 이를 적용하면 좀더 사실적이다.
변형(Deformation)
- 주로 렌더 타겟(Render Target)과 테셀레이션(Tessellation) 또는 런타임 버텍스 변형 (Runtime Vertex Dispacement, RVT)기술을 사용
- 렌더 타겟: 특정한 정보(발자국 위치, 깊이 등)를 실시간으로 그려서 보관하는 메모장같은 텍스처.
- 캐릭터가 지면 위를 걸어갈때, 그 부분만 텍스처를 실시간으로 업데이트한다.
- 이 자체로는 발자국이 남지 않는다. 데이터만 저장하고 있다.
- 테셀레이션: 폴리곤을 그래픽카드가 실시간으로 더 잘게 쪼개서 세밀한 굴곡을 만드는 기술.
- 렌더 타겟의 폴리곤을 쪼갠 뒤 아래로 꺼지게 만든다.
- 정교하지만 사양을 많이 타 다른 기술로 대체되는 추세다.
- 런타임 버텍스 변형: 렌더 타겟의 점들을 아래로 이동시킨다.
- 지형 자체에 점이 몇 개 없다면 발자국 모양이 각지거나 뭉툭하게 나온다.
- 렌더 타겟: 특정한 정보(발자국 위치, 깊이 등)를 실시간으로 그려서 보관하는 메모장같은 텍스처.
- 작동 원리
- 눈 지형을 아주 작은 격자로 나누고, 발이 닿는 부분의 높이 값(Heightmap)을 실시간으로 낮춘다.
- 장점
- 현실감을 준다.
- 단점
- 그래픽 카드 부하가 크다.
발자국에 지형이 변형되는 사소한 부분을 굳이 이렇게까지 공들여 표현할 이유가 있을까?
내가 체감한 바로는 충분히 가치가 있다. 호라이즌 제로 던에서 눈밭을 헤치고 나아가는 사실적인 그래픽은 기억에 선명하게 남을 정도로 좋은 느낌을 주었다. 여유만 있다면 확실히 구현하는 것이 좋을 것이다.
언리얼에서 적용하기
Step 1: RVT 에셋 생성 및 배치
- 프로젝트 폴더에 Runtime Virtual Texture 에셋을 두 개 만든다. (하나는 색상용, 하나는 높이값(Height)용)
- 레벨에 Virtual Texture Volume을 배치하고 방금 만든 에셋들을 할당한다. 이 볼륨 영역 안의 지형 정보는 RVT에 기록될 준비가 된다..
Step 2: 마스크(Mask) 기록용 렌더 타겟 준비
- 발자국이 찍힐 영역을 저장할 Canvas Render Target을 만든다.
- 캐릭터가 이동할 때마다 발 밑의 좌표를 계산해서, 이 렌더 타겟의 해당 위치에 '흰색 원'을 그리는 블루프린트를 작성한다.
Step 3: 랜드스케이프 머티리얼 설정
- 지형 머티리얼에서 RVT Sample 노드를 꺼낸다.
- 렌더 타겟의 '흰색(발자국)' 데이터가 들어오면, 해당 부분의 World Position Offset(WPO) 값을 마이너스 방향으로 준다.
- 이때 나나이트(Nanite)가 활성화된 지형이라면, 테셀레이션 없이도 수만 개의 폴리곤이 실시간으로 부드럽게 눌리게 된다.
디테일 추가
| 기능 | 구현 아이디어 | 효과 |
| 복원(Recovery) | 렌더 타겟에 'Fade' 로직을 추가. | 시간이 지나면 발자국이 서서히 차오르며 사라짐. |
| 노멀(Normal) | 파인 경계면에 노멀 맵 수치를 강하게 준다. | 실제로 파인 것보다 훨씬 깊고 날카로운 입체감을 줌. |
| 파티클 조합 | 발이 닿는 순간 눈 가루 파티클을 생성. | 물리적 변형과 시각적 효과가 결합되어 사실감 극대화. |
위에서 정리한 용어들을 렌더링 파이프라인 단계별로 정리하면 다음과 같다.
- 애플리케이션 단계 (CPU)
- 오브젝트 풀링: 메모리 부하를 줄이기 위해 객체를 미리 준비하는 단계.
- LOD / HLOD: 멀리 있는 건 대충 그리거나 합치기로 결정하는 최적화 단계.
- 오클루전 컬링: 가려진 건 아예 그리지 말라고 명령하는 단계.
- 기하 단계 (Geometry / Vertex Shader)
- 런타임 버텍스 변형: 눈을 밟았을 때 점(Vertex)의 위치를 실제로 옮기는 과정.
- 나나이트 / 테셀레이션: 점을 더 잘게 쪼개거나 효율적으로 관리하는 기술.
- 래스터화 단계 (Rasterization)
- 데칼: 3D 공간의 특정 위치에 2D 발자국 스티커를 투영하는 단계.
- 픽셀 단계 (Pixel / Fragment Shader)
- 오클루전(AO): 물체 사이의 틈새를 계산해 어둡게 칠하는 과정.
- 후처리 단계 (Post-Processing)
- 포스트 프로세싱: 렌더링이 끝난 화면에 블룸, 안개 등을 입히는 최종 보정.
- 볼류메트릭 포그: 빛줄기가 맺히는 입체적인 안개를 더하는 단계.
성능 저하가 일어날 경우, 단계별로 점검해야 부분이 다르다.
- CPU가 힘들어한다면?: 오브젝트 풀링, HLOD, 컬링(Culling) 설정을 다시 점검.
- GPU가 힘들어한다면?: 포스트 프로세싱 효과를 줄이거나, 볼류메트릭 포그의 해상도를 낮추고, LOD를 더 공격적으로 잡기.
- VRAM(메모리)이 부족하다면?: 렌더 타겟의 해상도를 낮추거나 텍스처를 압축.
'게임 개발 > 학습 일지' 카테고리의 다른 글
| 언리얼 C++ - Actor 클래스 생성 및 삭제 (0) | 2026.04.11 |
|---|---|
| 언리얼 엔진 심화 1주차 - 리플렉션/UHT/UBT/CDO (0) | 2026.04.10 |
| 언리얼 C++ - 빌드 프로세스 이해하기 (0) | 2026.04.09 |
| C++ 기초 - STL(Standard Template Library) (0) | 2026.04.09 |
| TA 코스 게임 분석 과제 - 스컬걸즈 (0) | 2026.04.06 |