언리얼 엔진 씬을 유화 느낌으로 바꿔주는 포스트 프로세스 머테리얼 만들어보기!
재미로 찾아보다가 발견하였습니다. 코드에 레퍼런스 페이지를 적어두었으니 확인해보시면 좋을 것 같습니다.
포스트 프로세스 머테리얼을 생성.
커스텀 노드를 생성한 후 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;
// 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);
SceneTexture(ID: PostProcessInput0) 노드와 효과 강도를 나타낼 스칼라값 파라미터 노드를 추가한 후 아래와 같이 구성.
머테리얼 인스턴스를 만든 후 포스트 프로세스 볼륨의 포스트 프로세스 머테리얼로 등록.
Oil Paint Intensity 파라미터를 조절하며 효과 확인.
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