Unity/Rendering&Shader

[SHADER] Shader pass와 ShaderLab pass에 대하여

김성인 2024. 4. 5. 00:06

[SHADER]Shader pass와 ShaderLab pass에 대하여

 


Shader pass


 셰이더 패스는 렌더링 되는 개체의 정점(vertex)나 조각(fragments)/픽셀(pixels)에 대해 특정 계산이 수행되는 렌더링 파이프라인의 단계를 나타낸다.


 각 패스에는 고유한 명령 및 데이터 세트가 있을 수 있고, 패스의 조합을 통해 복잡한 렌더링 효과를 얻을 수 있다.


셰이더 패스는 보통 다음과 같다.

- 입력 어셈블리 : 셰이더 패스가 시작되기 전에 입력 데이터를 어셈블해야 한다.  정점 셰이더의 경우 일반적으로 기하학적 기본요소(예를 들어 삼각형)의 정점을 처리하고 배치로 구성하는 작업이 포함된다.

- 버텍스 패스 : 렌더링되는 형상의 각 정점에서 버텍스 셰이더가 실행된다.  버텍스 셰이더는 버텍스를 객체 공간에서 화면 공간으로 변환하고, 조명(버텍스 라이팅) 계산을 수행하고, 텍스처 좌표와 같은 데이터를 후속 단계로 전달하는 일을 담당한다.  이 패스는 버텍스별로 작동한다. 즉 버텍스 하나하나에 일어나며 버텍스가 많을수록 많은 처리를 한다.

- 테셀레이션 패스(선택 사항) : 경우에 따라 버텍스 패스와 프래그먼트 패스 사이에 테셀레이션 패스가 존재할 수 있다.  사실 테셀레이션과 지오메트리는 기하학 패스 하나로 퉁쳐서 지칭 할 때도 있다.  이 패스는 특정 기준에 따라 형상을 세분화하여 디테일이나 부드러움을 높인다.

- 지오메트리 패스(선택 사항) : 테셀레이션 패스와 유사하게 지오메트리 패스는 선택 사항이며 테셀레이션 또는 변위 매핑과 같은 추가 기하학적 작업을 수행하는데 사용된다.

- 프레그먼트(픽셀) 패스 : 래스터화하여 생성된 각 프레그먼트에서 작동한다.  프레그먼트 셰이더는 조명 효과, 텍스처, 메테리얼의 프로퍼티, 기타 셰이더 효과를 적용하여 각 픽셀의 최종 색상을 계산한다.  버텍스 셰이더와 비슷하게, 픽셀 단위로 작동한다.

- 그림자 패스(선택 사항) : 동적 조명이 있는 장면에서는 객체가 다른 객체에 그림자를 투사하는 방법을 계산하기 위해 섀도우 패스가 포함될 수 있다.  동적 조명이라고 지칭한 이유는, 정적 조명, 베이크드 라이트맵의 경우 실시간으로 그림자를 그리지 않고, 미리 그림자를 텍스쳐로 제작 한 후, 각 객체에 텍스처를 입혀주는 방식이기 때문이다.

- 디퍼드 패스(선택 사항) : 디퍼드 렌더링 파이프라인에서는 여러 패스를 사용하여 조명 계산 등을 각각 분리하여 버퍼에 저장한다.  음... 잠깐 렌더링 패스에 대해서 이야기 해보면, 포워드 렌더의 경우 하나의 픽셀에 정해진 순서대로 색을 계속해서 겹친다면, 디퍼드 렌더의 경우 하나의 픽셀에 들어 갈 여러 색을 버퍼에 저장하여 필요에 따라 버퍼에서 색을 불러와 합성한다는 표현이 쉽게 설명할 수 있는 방법인 것 같다.

- 스크린 공간 패스 : 기본적인 렌더링 패스를 거친 후 추가 스크린 공간 패스는 블러, 칼라 그레이딩 또는 스크린 공간 반사등과 같은 포스트 프로세싱 효과를 위해 적용될 수 있다.  이런 패스는 화면에 렌더링된 최종 이미지에서 작동한다.



URP ShaderLab pass

 

위에서 설명한 셰이더 패스와 Unity에서 셰이더를 작성 할 때 사용하는 ShaderLab 내부의 패스는 다르다.

- 유니버셜포워드(UniversalForward) : 렌더링 패스가 포워드로 설정되어 있으면 작동하는 셰이더 패스로 이 패스에서 버텍스, 프레그먼스 등의 셰이더가 작동하며 렌더링 된다.  렌더링 패스가 디퍼드라면 이 패스가 필요 없다.

- 섀도우캐스터(ShadowCaster) :

- 지버퍼(GBuffer) : 포워드 렌더링 패스와 달리 디퍼드 렌더링 패스에서 작동한다.  역시나 렌더링 패스가 포워드라면 이 패스가 필요 없다.

- 뎁스온리(DepthOnly) : '카메라'를 기준으로 깊이 정보만 버퍼(깊이 텍스처)에 렌더링한다.  0 ~ 1 값이 저장되므로 흑백의 이미지 형태로 뽑힌다.

- 뎁스노말스(DepthNormals) : 뎁스온리와 다르게 장면의 깊이, 법선 정보를 생성하는 렌더링 패스이다.  뎁스온리와 다르게 RGB 값을 사용하기 때문에, 월드노말맵 같은 이미지 형태로 뽑힌다.


  뎁스노말스 패스의 기능은 다음과 같다.
   1. 깊이 정보 : 기본 렌더링 패스와 마찬가지로 카메라를 기준으로 장면을 렌더링한다.  그러나 색상을 렌더링하는 대신 카메라에서 객체까지의 거리를 나타내는 각 픽셀의 깊이만 기록한다.
   2. 노말 정보 : 각 픽셀에 위치해 있는 표면의 노말 정보도 기록한다.  노말은 빛이 물체 표면과 상호 작용하는 방식을 결정하며 조명 계산에 이용된다.
   3. Intermediate Buffer(임시로 사용되는 버퍼) : 뎁스노말스 패스에 의해 생성된 깊이 및 노말 정보는 일반적으로 Intermediate Buffer에 저장된다.  그런 다음 이러한 버퍼(이미지)는 포스트 프로세싱에서 사용된다.
   4. 포스트 프로세싱 : 깊이, 노말 정보를 포스트 프로세싱에 사용하여 장면의 시각적 품질을 향상시킬 수 있다.  예를 들어 심도 정보는 안개나 구름 같은데 필수적으로 사용되며, 노말 같은 경우 AO 등을 만드는것에 사용할 수 있다.
   5. 조명 계산 : 디퍼드 렌더링이나 이미지 기반 조명(IRP)과 같은 고급 조명 계산에도 사용될 수 있다.  이 데이터를 이용하면 조명 계산이 더욱 정확하고 현실적이 되어 라이트등의 정밀도가 올라간다고 할 수 있다.

- 메타(Meta) : 라이트 맵을 구울 때 사용한다.  라이트 맵은 런타임중 실시간 계산을 하는 것이 아니기 때문에, 빌드 시 이 패스는 제거된다.

- 유니버셜2D(Universal2D) : 이 부분은 나도 정확하게 모르지만, 유니티 메뉴얼을 보면 2D 조명을 계산한다고 한다.

'Unity > Rendering&Shader' 카테고리의 다른 글

[VFX] SCAN 연출  (0) 2024.04.14
[SHADER][POST-PROCESSING] Outline  (0) 2024.04.09
[SHADER] UV Vertex Animation  (0) 2024.01.10
[RENDERING] Screen Pos UV  (0) 2024.01.09
[SHADER] Rain Striked the lens - 1/2  (0) 2023.12.27