[UE5/Shader] 유화(Oil Painting) 효과

Tony Kim·2023년 10월 16일
0

언리얼로 개발하기

목록 보기
14/16
post-thumbnail

들어가기

언리얼 엔진 씬을 유화 느낌으로 바꿔주는 포스트 프로세스 머테리얼 만들어보기!
재미로 찾아보다가 발견하였습니다. 코드에 레퍼런스 페이지를 적어두었으니 확인해보시면 좋을 것 같습니다.

방법

  1. 포스트 프로세스 머테리얼을 생성.

  2. 커스텀 노드를 생성한 후 Oil Painting Effect라 명명하고 아래와 같이 작성.

// Oil Paint Effect
// Reference: https://ferkizue.blogspot.com/2018/04/oil-painting-post-process-effect-in.html

// Output Type: CMOT Float 4
// Inputs: SceneTexture, UV, Radius, InvSize 

int TexIndex = 14;

int intensityCount[10];
float avgR[10];
float avgG[10];
float avgB[10];
 

for (int iLevel = 0; iLevel < 10; iLevel++)
{
 	intensityCount[iLevel] = 0;
    avgR[iLevel] = 0.0;
    avgG[iLevel] = 0.0;
    avgB[iLevel] = 0.0;
}



UV *= 0.5;
for (int i = 0; i < Radius; ++i)
{
	int offsetI = -1 *(Radius / 2) + i;
    float v = UV.y + offsetI * InvSize.y;
    int temp = i * Radius;
    for (int j = 0; j < Radius; ++j)
    {
    	int offsetJ = -(Radius / 2) + j;
        float u = UV.x + offsetJ * InvSize.x;
        float2 uvShifted = UV + float2(u, v);
        float3 tex = SceneTextureLookup(uvShifted, TexIndex, false);

        float currentIntensity = ((tex.r + tex.g + tex.b) / 3 * 10);
        intensityCount[currentIntensity]++;
        avgR[currentIntensity] += tex.r;
        avgG[currentIntensity] += tex.g;
        avgB[currentIntensity] += tex.b;
    }
}


float maxIntensity = 0;
int maxIndex = 0;

for(int cLevel = 0; cLevel < 10; cLevel++)
{
	if(intensityCount[cLevel] > maxIntensity)
    {
    	maxIntensity = intensityCount[cLevel];
        maxIndex = cLevel;
    }
}

float newR = avgR[maxIndex] / maxIntensity;
float newG = avgG[maxIndex] / maxIntensity;
float newB = avgB[maxIndex] / maxIntensity;

float4 res = float4(newR, newG, newB, 1.0);

return res;
  1. 커스텀 노드를 하나 더 생성한 후 Viewport Texture Coordinate이라 명명하고 아래와 같이 작성.
// Viewport Texture Coordinate
// Reference: https://ferkizue.blogspot.com/2018/07/fixing-wrong-scene-size-in-unreal-419.html

// No Inputs
// Output Type: CMOT Float 2
return GetDefaultSceneTextureUV(Parameters, 14);
  1. SceneTexture(ID: PostProcessInput0) 노드와 효과 강도를 나타낼 스칼라값 파라미터 노드를 추가한 후 아래와 같이 구성.

  2. 머테리얼 인스턴스를 만든 후 포스트 프로세스 볼륨의 포스트 프로세스 머테리얼로 등록.

  3. Oil Paint Intensity 파라미터를 조절하며 효과 확인.


예시 영상

Infinity Blades Fire Lands

Infinity Blades Grass Lands

참고

https://ferkizue.blogspot.com/2018/04/oil-painting-post-process-effect-in.html
http://supercomputingblog.com/graphics/oil-painting-algorithm/
https://www.codeproject.com/Articles/471994/OilPaintEffect

profile
게임 테크니컬 아티스트

0개의 댓글