본문 바로가기
언리얼/Shader Study

02.언리얼 렌더링 파이프라인

by witn331ss 2023. 5. 28.

Ctrl + Shift + , 를 누르면 GPU시각화 툴이 나온다.

 

 

 

1. PrePass DDM_AllOpaque (불투명 프리패스)

 

동적 데칼(Dynamic Decal)을 처리하는 기능으로, 게임에서 오브젝트에 동적으로 추가되는 데칼 효과를 관리합니다. 동적 데칼은 텍스처나 마스크를 사용하여 오브젝트 표면에 투영되는 효과를 만들어내는데, 예를 들어 총알 구멍, 혈흔, 탄흔 등을 표현할 수 있습니다.

PrePass DDM_AllOpaque은 모든 불투명한 오브젝트에 대해 사전 처리를 수행하므로, 데칼 효과를 불투명한 오브젝트 위에 정확하게 표현할 수 있습니다. 이는 게임의 시각적 품질과 실시간 그래픽스 효과를 향상시키는 데 도움을 줍니다.

 

-

 

2. ComputeLightGrid (라이트영역 할당과 계산)

 

ComputeLightGrid은 빛의 정보를 그리드 형태로 저장하고 관리하는 기능으로, 게임에서 동적으로 변경되는 조명 정보를 효율적으로 처리할 수 있도록 도와줍니다. 이를 통해 게임에서 실시간으로 조명을 변경하거나 이동할 때 빠르게 조명 업데이트를 수행할 수 있습니다.

ComputeLightGrid는 특히 동적 조명의 그림자 계산과 조명 영향력을 고려할 때 중요한 역할을 합니다. 빛의 위치, 색상, 강도 등의 정보를 그리드로 구성하여 빠르게 액세스할 수 있으며, 그림자 맵핑, 반사, 환경광 등 조명 효과를 실시간으로 계산하는 데 사용됩니다.

(볼륨형태를 연살할때도 이용되는 것이라고 생각하면 된다)

 

-

 

3. BeginOcclusionTests (차폐 테스트)

 

BeginOcclusionTests는 렌더링 파이프라인에서 사용되며, 가시성 테스트를 수행하는 단계의 시작을 나타냅니다. 가시성 테스트는 렌더링 과정에서 각 객체 또는 렌더링 요소의 가시성을 결정하는 작업으로, 화면에 실제로 보여질지 여부를 판단하는 과정입니다.

BeginOcclusionTests를 사용하면 렌더링 시스템은 가시성 테스트를 시작하고, 객체 또는 렌더링 요소의 가시성을 효율적으로 확인할 수 있습니다. 이를 통해 불필요한 계산 및 렌더링 작업을 줄이고, 성능을 최적화할 수 있습니다.

 

-


4. BuildHZB (Hi-z 버퍼)

 

BuildHZB는 Hierarchy-Z-Buffer의 약자로, 화면의 픽셀들을 계층 구조로 정렬하고, 픽셀의 깊이 값을 기반으로 가시성을 계산하는 기능입니다. 이를 통해 화면에 표시될 픽셀들의 가시성을 효율적으로 결정할 수 있습니다.

BuildHZB는 일반적으로 전체 화면의 가시성을 계산하는 데 사용되며, 그림자 맵핑, 환경 광 등 그래픽스 효과를 적용할 때 중요한 역할을 합니다. 화면에 표시되는 픽셀들의 가시성을 빠르게 계산하면 불필요한 렌더링 작업을 줄이고, 성능을 향상시킬 수 있습니다.

 

-

 

 

5. ShadowDepths (쉐도우 뎁스)

 

ShadowDepths는 렌더링 파이프라인의 그림자 계산 단계에서 호출되며, 그림자를 생성하는 데 필요한 정보와 계산을 수행합니다. 이를 통해 게임에서 오브젝트와 라이트 소스 사이의 그림자 효과를 생성하고 시각적인 실감을 제공합니다.

ShadowDepths는 주로 그림자 맵을 생성하고 그림자를 계산하는 데 사용됩니다. 그림자 맵은 라이트 소스의 위치와 방향에 따라 오브젝트가 어떤 그림자를 받아야 하는지를 나타내는 텍스처입니다. 이를 통해 실시간 그림자 효과를 구현하고, 조명에 따른 오브젝트의 그림자 처리를 수행할 수 있습니다.

 

그림자 연산은 무겁다 / 그림자맵은 라이트맵 계산 등 복잡한 단계여서 그렇다

볼륨포그같은게 들어가서 연산이 더 무거워지기도 하다

 

 

-

 

 

6. BasePass (베이스 패스)

 

BasePass는 주로 불투명한 오브젝트의 렌더링을 처리합니다. 이 단계에서는 오브젝트의 기하학적 형상, 텍스처, 재질 등을 기반으로 화면에 오브젝트를 그리고, 조명, 그림자, 반사 등의 효과를 적용합니다.

 

물체가 많을 수록 연산이 늘어난다. 이 단계부터 재질이나 색상의 대한 계산이 들어간다.

 

 

-

 

7. LightCompositionTasks_PreLighting (프리라이팅으로 주변폐색 계산)

 

LightCompositionTasks_PreLighting은 조명 정보를 사전에 계산하여 효율적으로 저장하고, 렌더링 단계에서 이를 적용함으로써 조명 효과를 빠르게 계산할 수 있도록 도와줍니다. 이를 통해 게임에서 실시간 조명 처리에 대한 부하를 줄이고, 렌더링 성능을 향상시킬 수 있습니다.

LightCompositionTasks_PreLighting은 일반적으로 다음과 같은 작업을 포함합니다:

미리 계산된 조명 정보의 로드: 사전에 계산된 조명 데이터를 메모리에 로드하여 사용 가능하게 합니다.
조명 복합 작업: 미리 계산된 조명 정보를 현재 렌더링 상태와 조합하여 최종 조명 효과를 계산합니다.
조명 효과의 적용: 계산된 조명 정보를 기반으로 렌더링 작업 중 오브젝트에 조명 효과를 적용합니다.

 

-

 

8. DiffuseIndirectAndAO (간접광과 AO계산)

 

DiffuseIndirectAndAO는 오브젝트의 표면에 빛의 간접 차폐와 주변 환경의 조명 감소 효과를 계산하여 텍스처에 적용합니다. 이를 통해 오브젝트의 그림자, 조명 반사, 간접 조명 등 시각적인 디테일을 추가하고, 재질의 실제적인 외관을 표현합니다.

DiffuseIndirectAndAO는 일반적으로 다음과 같은 작업을 포함합니다:

빛의 간접 차폐(Diffuse Indirect) 계산: 오브젝트에 반사되는 간접 조명을 계산하고, 표면에 추가합니다.
환경 광(Ambient Occlusion) 계산: 오브젝트의 주변 환경에서의 광의 감소를 계산하고, 텍스처에 적용합니다.
텍스처 매핑: 계산된 간접 차폐와 환경 광 정보를 텍스처에 매핑하여 시각적인 효과를 표현합니다.

 

 

-

 

 

9. Lights (라이트 계산)

 

"Light"라는 용어는 GPU Visualizer에서 그래픽 프로세스에서 사용되는 조명 요소를 가리킵니다. 이는 그래픽스 작업 중 조명에 대한 정보를 포함하고 있으며, 조명의 유형, 위치, 방향, 색상, 강도 등을 표시할 수 있습니다. 이를 통해 그래픽 디자이너는 조명 설정과 조명 효과에 대한 시각적인 피드백을 얻을 수 있습니다.

GPU Visualizer를 사용하여 "Light" 정보를 시각적으로 확인하면 조명의 역할과 영향을 이해하고 조명 설정을 최적화하는 데 도움이 됩니다. 그래픽 프로세스의 조명 관련 작업을 분석하고 최적화하기 위해 GPU Visualizer에서 제공되는 "Light" 정보를 활용할 수 있습니다.

 

조명을 디테일하게 나눔 불투명 반투명에 들어가는 라이트를 따로 계산하고

그림자를 드리우는 조명이랑 그게 아닌 조명이랑 또 따로 계산하는 등 엄청 세부적으로 나눠서 계산한다.

 

라이트에서 병목이 일어나는걸 지워 나가면서 최적화를 시킬 수도 있겠다.

 

반투명은 정말 무겁다.

 

 

-

 

 

10. ScreenSpaceReflections (화면 공간 반사와 환경 반사취합)

 

Screen Space Reflections는 실시간 렌더링 과정에서 화면에 나타나는 반사 효과를 계산하는 데 사용됩니다. 일반적으로 오브젝트의 표면에서 반사되는 빛을 화면에 동적으로 표현하는 데 사용됩니다. 이를 통해 물체나 주변 환경의 반사가 실시간으로 표현되어 시각적인 실감을 제공합니다.

Screen Space Reflections는 다음과 같은 작업을 수행합니다:

화면 공간에서 반사 벡터 계산: 뷰 카메라의 위치와 픽셀의 표면 법선을 기반으로 반사 벡터를 계산합니다.
화면 공간에서 반사 정보 샘플링: 반사 벡터를 기반으로 주변 텍스처를 샘플링하여 반사 정보를 가져옵니다.
반사 정보의 블렌딩 및 적용: 가져온 반사 정보를 현재 픽셀에 블렌딩하고, 반사 효과를 실시간으로 표현합니다.

 

반사는 온전히 러프니스에 의해 계산된다.

 

 

##

여기까지가 순서대로 진행되는 렌더방식

 

 

-

 

 

10. Translucency (투명물체 렌더링)

 

라이트계산까지 다하고 반투명으로도 보여줘야하기 때문에 그전에 반투명으로 보여줄 수 없다!

그래서 투명 물체는 좀 늦게 렌더링건다 (순서대로 안하는거 같음)

 

이게 조명을 받고 그림자도 받고 재질도 받으면 비용이 엄청나진다

반투명끼리 겹치면 또 상을 뒤집어야해서 액체랑 반투명은 참 어려운게 많다.

 

 

-

 

 

11. Distortion (굴절계산)

 

투명물체는 주로 뒤로 비춰지는것에 대해서 굴절도가 있기 마련이다 (창문 같은 것은 그게 적거나 없을 수도 있지만)

곡면을 가지면 그부분에 대한 투명 굴절계산을 또 해야한다.

 

 

-

 

 

12. PostProcessing (포스트 프로세싱)

 

옛날 모바일 게임같은경우는 포스트 프로세싱하면 화면 전체 갱신을 해야해서 잘 쓰진 않았는데

요즘은 거진 디폴트로 사용된다고 보면 된다.

 

후처리도 꽤나 무겁다

 

화면에 그려진 전체 이미지를 건드는 일이라고 생각하면 된다.