프로그래밍/언리얼엔진

그래픽스 공부

하바사 2025. 4. 26. 22:27

노멀맵이란

조명 반응만으로 울퉁불퉁한 표면처럼 보이게 만드는 마법의 텍스처.

3D 모델에 디테일을 넣으려면, 예전엔 정말로 작은 돌기나 주름까지 다 모델링해야 했음.
근데 그러면 폴리곤 수가 엄청나게 많아져서 성능에 큰 부담이 생김.

그래서 나온 게 실제로 표면이 울퉁불퉁하지 않아도, 조명에만 그렇게 반응하도록 속이는 기술. 즉, 거기 튀어나온 것처럼 보이게만 하고, 진짜로는 평평함.

 

노멀맵은 보라색+파란색 계열의 특이한 텍스처로 보임.
그 안에는 각 픽셀이 어디 방향으로 빛을 반사해야 하는지에 대한 정보(RGB = XYZ 벡터)가 담겨 있.

  • 빨간색(R) → X 방향 기울기
  • 녹색(G) → Y 방향 기울기
  • 파란색(B) → Z 방향 기울기 (보통 1에 가까움)

 

벽돌 벽의 홈, 갑옷의 작은 스크래치, 얼굴의 모공…
모델링하지 않고 노멀맵으로 ‘보이게만’ 함

  • 쉐이더(Shader)는 이 노멀 정보를 보고, 빛의 반사 방향을 바꿔서 그림자를 만드는 척 함.
  • FPS 게임에서 보면 총이나 손에 빛이 스르륵 흘러가며 반짝이는 느낌, 대부분 노멀맵.

 

요약

목적 표면 디테일을 조명 반응만으로 구현해서 퍼포먼스를 절약
결과 울퉁불퉁해 보이지만, 실제로는 평평한 표면
핵심 기술 픽셀마다 표면 노멀 벡터를 텍스처로 전달
비유 조명에 반응하는 '속임수 양각무늬 스티커'

 

 

G버퍼란

G버퍼는 '화면의 각 픽셀이 가진 다양한 정보를 따로따로 저장해둔 버퍼 묶음'.
→ 그래야 나중에 조명 계산을 한꺼번에 할 수 있음.

기본적으로 게임 엔진은 물체를 화면에 그릴 때, 각 픽셀마다:

  • 이게 무슨 재질인지?
  • 노멀 방향은 어떤지?
  • 월드 포지션은 어디인지?
  • 텍스처 색깔은 뭔지?

같은 정보를 필요로 함. 그런데 Forward Rendering에서는 '그릴 때마다 조명 계산까지 같이 해야 하니까' 조명이 많아지면 성능이 부하. 그래서 Deferred Rendering + G-Buffer 시스템을 사용함.

1단계: 먼저 각종 정보를 쌓아놓기만 함.

  • 픽셀마다 필요한 데이터만 모아둠.
  • 이게 바로 G버퍼 (Geometry Buffer)

2단계: 그 정보들을 바탕으로 나중에 조명 처리만 한꺼번에 .

  • 조명 1만 개여도 한 번만 훑으면 되니까 성능 면에서 나음.

G버퍼 안에 뭐가 들어 있을까?

BaseColor / Albedo 표면의 색상 Diffuse 계산
Normal 표면의 방향 (벡터) 빛 반사 방향, 라인렌더링 필터
Roughness / Metalness 질감 정보 (매끈한지, 금속인지 등) PBR 셰이딩
Depth 화면에서 카메라까지의 거리 포스트 이펙트, 외곽선
Specular 광택 정도 하이라이트 계산
World Position (추가 구성 가능) 픽셀의 실제 위치 (XYZ) 특수효과, 뎁스 기반 연산 등

 

G버퍼를 쓰면

  • 외곽선 렌더링, 쉐도우, 포스트 이펙트, 드로잉 필터, 환경광 이런 걸 후처리에서 유연하게 제어할 수 있음
  • 즉, 한 번 그려놓고 그 위에서 세팅 가능.
  • NPR, 셀셰이딩, 실루엣 강조, 비주얼 이펙트 다 여기서 커스터마이징 가능함.

결론

"G버퍼는 마치 카메라로 사진을 찍었는데,
일반 사진이 아니라 '색상 사진', '깊이 사진', '표면 방향 사진' 등을
각각 다른 렌즈로 동시에 찍어놓은 세트" 

그걸 모아서 나중에 합성해서 조명/효과를 입히는 것.
그래서 디퍼드 렌더링은 일종의 실시간 합성 파이프라인이기도 함

 

3D 툴 기반 렌더링 워크플로우:

보통 3D 툴(예: Maya, Blender)에서는,

  1. 렌더 패스(diffuse, specular, shadow, AO 등)를 분리해서
  2. 합성 프로그램(Nuke, After Effects 등)에서 후처리하고 합성하여
  3. 최종 결과물을 만듦.

비용이 들고, 실시간성이 없는 대신 퀄리티 제어가 정교함.

 

Unreal의 디퍼드 렌더링(Deferred Rendering):

Unreal Engine에서는 디퍼드 렌더링을 사용하면,

  • G-Buffer에 각종 정보(알베도, 노멀, 깊이, 월드 포지션 등)를 저장한 뒤
  • 그걸 가지고 후처리 단계(Post-processing)에서 조명, 효과, 셰이딩을 따로 계산함.

즉, 렌더 패스 기반 합성을 실시간으로 유사하게 흉내 낼 수 있음.

'프로그래밍 > 언리얼엔진' 카테고리의 다른 글

Scalability Settings 정리  (2) 2025.07.12
[언리얼] Anti-Aliasing, Upscaling Method  (0) 2025.05.30
프로파일링과 최적화 작업  (0) 2025.04.12
개인 작업-1-  (0) 2025.03.22
언리얼 공부 노트  (0) 2025.02.22