본문 바로가기

Shader

Sharpen Filter 만들기

 

전에 했던 거랑 똑같이 한 중심픽셀에서 주변 픽셀을 비교해서 구현한다!

Blur가 특정 픽셀 주변의 픽셀들의 평균을 구해서 현재 픽셀에 적용하는 것이라면, Sharpen은 중심 픽셀과 주변 픽셀의 차이를 강조하는 것!

이를 구현하는데에는 2가지 방법이 있다! 그러나 결국 같은 방법인데 구현 식이 다른 것! 새로운 방법을 알게 됌!

 

일단 새로운 노드 발견!

항상 (-1,0), (0,1).....이렇게 하나하나 Float2값을 생성해서 쓰다보니 지저분하게 늘어졌는데

'BlurSampleOffsets'를 쓰면 좀 간편해진다!!

BlurSampleOffsets 노드. 오른쪽 이미지처럼 쓰면 된다

 

노드 이름에서 헷갈리면 안됌. 이것은 Blur 구현할때만 쓰는 것이 아님! 이건 그냥 단순히 곱하기 노드이다!

input에 OffsetAmout는 Vector2 값인데 이 input에 각 (0,1), (1,0), (0,-1), (-1,0), (-0.5, 0.5), (0.5, 0.5), (0.5, -0.5), (-0.5, -0.5) 값을 곱해서 Output로 나오는게 BlurSampleOffsets 노드이다. 자세히 보고 싶으면 그냥 더블클릭해서 material function 보면 됌. 그냥 곱하기 함수인걸 알 수 있다

(참고 : https://youtu.be/_MrcIpyb3eo?si=ftwQyX8hHnwwDRWd)

 

 

 

 

그래서 언리얼엔진에서 Sharpen Filter를 구현하는 방법을 설명해보겠다!! 

 

 

1. 첫번째 방법

Kernal을 이용하여 Convolution 연산을 하는 방법.

원래 알고 있는 방법. 저번에 툰셰이더 아웃라인 만들 때 썼던 방법.

 

https://youtu.be/Ptuw9mxekh0?si=coOdHXG46UDX7gSM (2:43)

 

3x3을 이용하는 경우 커널값은 위와 같다.

 

 

 

그래서 커널 값을 곱해서 위와 같이 구현해주면 된다. 좌표에 커널 값을 곱해서 다 더한 다음 주변픽셀 수만큼 나누기.

 

 

++Texel Size란?

더보기

++Texel Size

이것에 대해 뭔가 자세히 설명되어있는 자료를 찾을 수 없었음ㅜ.ㅜ

 

그래서 챗지피티한테 물어본 결과 : 

texel Size는 텍스처의 한 픽셀의 크기를 반환하는 노드입니다. 이는 텍스처 공간에서의 크기를 의미합니다. 텍스처 공간은 텍스처가 어떻게 매핑되는지에 대한 좌표 체계를 나타냅니다.

이 노드는 종종 셰이더에서 사용되어, 예를 들어 텍셀 기반의 효과를 적용하려는 경우에 유용합니다. 텍셀은 텍스처의 한 픽셀을 나타냅니다. 따라서 texel Size를 사용하면 한 픽셀의 크기에 따라 어떤 효과를 적용할지를 결정할 수 있습니다.

다음은 이 노드의 주요 기능입니다:

  1. 텍셀의 가로 및 세로 크기 제공: texel Size는 텍스처의 가로 및 세로 픽셀 크기를 반환합니다. 예를 들어, 2D 텍스처의 경우, (1/텍스처 너비, 1/텍스처 높이)의 값을 반환합니다.
  2. 텍셀 기반 연산에 사용: 특히 텍셀 기반의 효과를 구현할 때 유용합니다. 예를 들어 블러 효과를 만들 때, 텍셀의 크기에 따라 블러의 강도나 방향을 결정하는 데 사용할 수 있습니다.
  3. 유니폼한 결과 도출: texel Size는 텍스처의 크기와 무관하게 일정한 값을 반환합니다. 이는 텍스처의 크기가 변해도 동일한 셰이더 코드를 사용할 수 있게 합니다.

 

언리얼엔진 공식 문서 :

SceneTexelSize 표현식을 사용하면 SceneColor 및 SceneDepth 표현식을 사용할 때와 마찬가지로 텍셀 크기만큼 오프셋할 수 있습니다. 이 표현식은 멀티 솔루션 시스템에서 에지(edge)를 탐지하기 좋은 방법으로, 이러한 계산을 하지 않으면 작은 고정 값을 사용할 수밖에 없어, 해상도가 떨어지며 일관되지 않은 결과가 나옵니다.

 

 

 

2. 두번째 방법

Kernal 안쓰고 연산하기

결국 첫번째 방법과 같은 결과가 나온다

 

 

커널값 곱하지 않고 다 더해서 중심픽셀에서 빼주기

왜 첫번째 방법과 같은지 모르겠다면 직접 3x3 픽셀에 각각 아무 값이나 지정해보고 첫번째 방법, 두번째 방법 연산해보기!

 

중심픽셀에서 빼는 이유?

Sharpen 효과를 구현할 때 주로 사용되는 방법 중 하나는 주변 픽셀과의 차이를 강조하는 것입니다. 여러 커널을 사용하여 주변 픽셀과의 차이를 계산한 다음, 이 값을 원래의 이미지에 더해주는 방식으로 Sharpen 효과를 얻을 수 있습니다.

(-1, 0), (0, 1), (1, 0), (0, -1)과 같은 커널은 각 방향의 주변 픽셀과의 차이를 계산하는 데 사용됩니다. 이렇게 계산된 값들을 더하면 이미지에서 선명한 부분이 강조됩니다.

그런데 이후에 그 값을 4로 나누어서 (0, 0)의 값에서 빼는 이유는 블러링과 반대로 선명하게 만들기 위한 것입니다.

  1. 블러링과 대조적인 효과: 일반적인 블러 효과는 특정 픽셀 주변의 픽셀들의 평균을 구해서 현재 픽셀에 적용합니다. 이는 이미지를 흐리게 만듭니다. 하지만 선명화를 원한다면, 현재 픽셀에서 주변 픽셀들의 차이를 강조하고자 합니다. 그래서 블러 효과와 반대로 현재 픽셀에서 주변 픽셀들의 차이를 더해주게 됩니다.
  2. 값의 범위 조절: 계산된 값이 너무 커지면 이미지가 밝게 변할 수 있습니다. 그렇기 때문에 4로 나누어주는 것은 결과 값을 줄여서 이미지의 밝기를 보존하기 위한 것입니다. (0, 0)에서 빼주는 것은 주변 픽셀과의 차이를 현재 픽셀에 더해줄 때, 현재 픽셀의 값이 너무 크게 증가하지 않도록 하는 역할을 합니다.

 

 

 

 *Sharpen의 정도 조절하는 법