# Part 23 | 포스트 프로세스 (Post Process)

## 01 포스트 프로세스를 위한 기본 작업

**포스트 프로세스**

* 모든 작업이 끝난 화면 위에 하는 작업
* 렌더링이 끝나 화면에 나와 있는 이미지를 텍스쳐라고 생각하는 것
* 책이 출판된 이후에 [Custom Post Process를 만들 수 있는 Full Screen Renderer Feature](https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@14.0/manual/post-processing/custom-post-processing.html)가 생겨난듯 하다. 책에 나와있는 거 대신 이걸로 진행.

## 02 흑백 포스트 프로세스 만들기

![](https://velog.velcdn.com/images/biomatrix117/post/b8b3bed7-0fca-402f-992f-3039fadc2b90/image.png)

* 렌더러 새로 만들어서 파이프라인에 적용시킨다
* 렌더러에 Full Screen Renderer Feature 추가한다
* 렌더러 피쳐에 Full Screen Pass Shader Graph 만들고 적용시킨 머테리얼 적용시키기
* 셰이더 그래프에서 URP Sample Buffer와 Vector 3 값을 외적한다
* URP Sample Buffer 노드 : 현재 렌더된 프레임, 현재의 스크린 텍스쳐를 가져온다
* Vector 3 외적하는 이유 : 흑백으로 만들어주려고. 인간 눈 색깔 받아들이는 어쩌구 그거 계수
* BlitSource : 라이팅, 그림자, bloom 같은 이전의 렌더링, 포스트 프로세싱 결과 가져옴

## 03 블러 만들기

**Box blur**

박스 블러 : 모든 칸이 자신의 색깔을 /9해서 인접한 8칸에 뿌려서 이미지 만듦 (물론 자기 자신도 더해짐)

![](https://velog.velcdn.com/images/biomatrix117/post/b2e4c30b-d972-4d38-8f7d-8e3b4accabdc/image.png)

![](https://velog.velcdn.com/images/biomatrix117/post/627b2b8f-d259-45b5-9260-8fe4f6f8ffc3/image.png)

* UV 좌표는 `0~1` 사이다.
* 한 픽셀은 UV를 화면의 픽셀 사이즈로 나눈 크기다.
* Screen 노드를 사용하면 현재 화면의 픽셀 사이즈를 얻어올 수 있다.

겨우 9픽셀 블러 넣은거라 차이가 크진 않다.\
이것보다 늘리면 더 효과가 강해지겠지만, 연산이 많아지게 된다.\
평균값으로 만드는 블러 방식이라 품질이 좋은 편도 아니다.

> **Troubleshooting**

* URP sampling buffer 포함한 서브 그래프 만들었더니 `Validation: URP Sample Buffer Node is not allowed by Custom Render Texture implementation` 에러 발생.
* 이 노드는 Fullscreen Shader Graph용으로 만들어진거라 다른 곳에서 쓰면 안된다고 함. 만드는 거 자체는 문제는 없다고 함.
* 만들었더니 `unrecognized identifier 'TEXTURE2D_X' at line 181` 오류 발생
* 검색했더니 [HDRP 전용 기능](https://issuetracker.unity3d.com/issues/false-unrecognized-identifier-texture2d-x-error-with-custom-shader)이라고 함. gpt한테 물어봤더니 원래 HDRP 코드도 같이 생성되는게 맞다고 함. 이유는 정확히 안 알려줌.
* 근데 무시하고 그냥 사용해봤더니 픽셀 이동 잘만 함
* 셰이더 그래프 창 닫았다가 다시 여니까 경고창도 없어짐

다운샘플링 해보려고 했는데 그 기능 자체는 제공되는 셰이더 코드가 해주고,\
셰이더 그래프는 좌표를 알맞게 바꾸는 방식으로 수정하는 것만 남아있어서 일단 스킵.\
실제로는 다운샘플링 해줘야 연산도 적어지고 효과도 커진다고 함.

**Gaussian Blur**

![](https://velog.velcdn.com/images/biomatrix117/post/72f0fe00-bab0-4da5-ad37-bf62d12fe875/image.png)

정규분포 기반으로 픽셀들을 가로 7칸에 걸쳐 배분해준다.\
렌더 피쳐 새로 만들고 세로축에 대해 배분해주는 머테리얼 추가로 넣어주면 가로도 세로도 블러됨.\
이미 가로 블러가 된 이미지를 가지고 세로로 블러하는 것이기 때문에 가볍게 연산할 수 있다.

**어떤 연산이 셰이더에서 무거운 연산일까?**

* 필요 없는 연산은 제거해야 한다
* 알파 블렌딩(Transparent)는 무겁다
* Lit 셰이더는 SimpleLit 등에 비해 그 자체로 무겁다
* 텍스쳐가 아니라 연산으로 그림 그리는 노드들은 일반적으로 무겁다

## 04 비내리는 효과 만들기

![](https://velog.velcdn.com/images/biomatrix117/post/b1177f12-8b00-4b5e-9cd7-a766b3c241fb/image.png)

* PP\_Rain이라는 Fullscreen Shader Graph와 머테리얼을 만들어 Post Process Renderer의 Renderer Feature에 적용한다
* Post Process Renderer 말고도 다른 Renderer가 파이프라인에 존재해야 한다
* 제공된 파티클을 땅 아래쪽에 잘 숨기고, 레이어를 Particle로 설정한다
* 파티클만 촬영할 카메라를 만들어 준다
  * Projection은 Orthgraphic
  * Renderer은 PP Renderer말고 기본 렌더러
  * Culling Mask는 Particle
  * Environment > Background Type > Solid Color > 검은색
  * 카메라를 적절히 위치시켜 파티클을 촬영한다
* 촬영한 카메라를 렌더 텍스쳐로 만든다
  * Create > Render Texture
  * size는 2048x2048
  * Color Format은 R16\_UNORM (16비트 채널 하나만 받음)
  * 렌더 텍스쳐를 파티클 촬영 카메라의 Output Texture에 연결해준다
* 렌더 텍스쳐를 Normal From Height 노드를 이용하여 노말맵으로 바꿔주고, URP Sample Buffer의 UV에 넣어준다

> **Troubleshooting**\
> 셰이더 그래프 만들었는데 작동 안 함. 렌더러 피쳐의 Requirements에서 Normal을 체크해주니 작동됨.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://lazyartisan.gitbook.io/note/main-page/books/urp/part-23-or-post-process.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
