Computer Graphics/OpenGL

OpenGL 정리 - 27. Deffered Shading

surkim 2024. 11. 10. 13:00

지연 셰이딩 (Deferred Shading)

기존의 3D 그래픽 렌더링에서는 조명 소스와 오브젝트가 늘어날수록 연산량이 폭증하여 성능이 빠르게 저하된다. 특히 화면 밖에 있는 오브젝트다른 오브젝트 뒤에 가려진 오브젝트도 조명 계산에 포함되기 때문에, 연산 낭비가 심각하다. 지연 셰이딩은 이러한 문제를 해결하기 위해 조명 계산을 렌더링 후반부로 미뤄 불필요한 계산을 줄이는 방식으로, 복잡한 장면에서 렌더링 성능을 크게 개선할 수 있다.

지연 셰이딩의 기본 원리

지연 셰이딩에서는 모든 기하학적 데이터를 G-buffer라는 여러 텍스처로 구성된 버퍼에 저장하고, 이를 기반으로 나중에 조명 계산을 수행한다. 이 방식으로 조명 연산을 한 번에 처리할 수 있어 불필요한 계산을 최소화할 수 있다.

  1. 기하 단계 (Geometry Pass)
    우선 각 픽셀에 필요한 3D 위치, 노말 벡터, 색상, 스페큘러 강도 등의 정보를 G-buffer에 저장한다. 이 단계에서는 기하 데이터만 모아둔 후 조명 계산은 생략한다. 이렇게 하면 조명 연산에 필요한 정보를 미리 확보할 수 있어 다음 단계의 조명 계산이 수월해진다.
  2. 조명 단계 (Lighting Pass)
    G-buffer에 저장된 정보를 바탕으로 실제 조명 계산을 진행한다. 조명 소스의 위치와 색상 정보는 uniform 형태로 각 픽셀에 전달되며, G-buffer의 데이터를 참고하여 최종 조명을 계산한다. 각 조명은 각 픽셀에 필요한 정보만 연산하게 되어 성능이 크게 향상된다.
  3. 최종 단계 (Final Pass)
    조명 계산이 완료된 결과를 화면에 렌더링한다. 이때 추가적인 포스트 프로세싱이나 텍스처 블렌딩이 필요하다면 전방 렌더링(forward rendering)과 혼용하여 처리한다.

G-buffer의 구성 요소

G-buffer는 조명 계산에 필요한 정보를 담고 있는 여러 텍스처 집합이다. 일반적으로 다음과 같은 정보가 포함된다:

  • 3D 월드 공간 위치: 각 픽셀의 월드 좌표로, 조명 계산에 필요한 거리와 방향 벡터를 얻기 위해 필요하다.
  • 알베도(Albedo): 오브젝트의 확산 반사에 사용할 기본 색상 정보이다.
  • 노말 벡터(Normal Vector): 표면의 방향을 나타내며, 조명 계산에서 중요한 역할을 한다.
  • 스페큘러 강도(Specular Intensity): 반사광의 세기와 확산 정도를 제어한다.
  • 추가적으로 조명 소스의 위치와 색상, 뷰 포지션 벡터를 추가하여 더욱 상세한 조명 계산이 가능하다.

지연 셰이딩의 장점과 단점

  • 장점:
    • 많은 조명 소스가 있는 장면에서 효율적이다. G-buffer에 필요한 정보를 모두 저장한 후 필요한 조명 연산만 수행하므로 성능을 크게 최적화할 수 있다.
  • 단점:
    • 블렌딩 제한: G-buffer가 각 픽셀에 대해 단일 정보를 저장하므로, 투명한 오브젝트의 블렌딩 연산이 어렵다.
    • 단일 셰이딩 방식: 모든 픽셀에 동일한 셰이딩 방식을 적용해야 한다. 복합 효과가 필요한 경우 전방 렌더링(forward rendering)과 함께 사용해야 한다.
    • 메모리 사용량 증가: G-buffer는 여러 텍스처를 저장해야 하기 때문에 메모리 사용량이 상당히 커질 수 있다.

많은 조명 소스와 지연 셰이딩의 최적화

지연 셰이딩은 조명 소스가 많을 때도 성능을 유지할 수 있지만, 모든 조명을 단순히 uniform 변수로 전달하는 방식은 비효율적이다. 이는 모든 픽셀에 대해 모든 조명을 일일이 계산하게 되어 성능 저하로 이어질 수 있다. 이를 해결하기 위해 라이트 볼륨(Light Volume) 개념을 도입한다.

  1. 라이트 볼륨의 개념
    각 조명 소스에 대해 구 형태의 볼륨을 생성하여, 이 범위 내에서만 조명 계산을 수행하도록 한다. 이는 조명이 닿는 범위 내 픽셀에만 계산을 집중하여 성능을 높일 수 있다.
  2. 조명 패스 적용
    기하 단계 후, 각 조명 소스에 대해 구 형태의 라이트 볼륨을 그린다. 이 볼륨 내에서만 조명 계산이 이루어지도록 하여, 필요한 픽셀에만 조명 연산을 적용한다.
  3. 조명 결과의 누적
    각 조명 소스의 계산 결과를 화면에 누적하여 최종 조명 효과를 얻는다. 이 방식은 여러 조명을 동시에 처리할 수 있어, 특히 실시간 조명이 많은 장면에서 성능이 크게 개선된다.

이와 같은 방식으로 지연 셰이딩을 구현하면 다수의 조명 소스를 효율적으로 처리하여 복잡한 장면에서도 성능을 최적화할 수 있다.