[CC] 유리창에서 데칼이 안 먹는 이유! #Unreal #rendering #material #shader

제가 운영하는 채널입니다. 많은 방문 부탁드립니다.

채널바로가기

📌 언리얼 엔진에서 반투명 오브젝트에 데칼이 적용되지 않는 이유는 무엇인가?

데칼은 사전에 배치된 오브젝트의 신 댑스 값을 이용하여 겹쳐진 영역에 배치되는 원리인데, 반투명 오브젝트는 신 댑스 값에서 빠지기 때문에 겹쳐진 영역을 구할 수 없어 렌더링이 불가능하기 때문입니다

💡 반투명 오브젝트에 데칼과 유사한 효과를 적용하는 방법은?

매쉬와 데칼 머트리얼을 혼합하여 사용하면 데칼을 적용한 것과 비슷한 느낌의 효과를 만들 수 있습니다

목차

이 튜토리얼은 언리얼 엔진에서 데칼이 반투명 오브젝트에 적용되지 않는 이유와 해결 방법을 설명합니다. 핵심은 데칼이 신 댑스(Scene Depth) 정보를 활용하여 렌더링되는데, 반투명 오브젝트는 신 댑스에 포함되지 않기 때문입니다. 해결책으로, 데칼 머티리얼을 메시(Mesh)에 직접 적용하는 방법을 제시하며, 이를 통해 데칼과 유사한 효과를 낼 수 있습니다. 이 튜토리얼은 언리얼 엔진에서 데칼을 효과적으로 사용하는 방법을 제시하여, 렌더링 문제를 해결하고 시각적 완성도를 높이는 데 도움을 줍니다.

1. 🪟 데칼이 반투명 오브젝트에 적용되지 않는 문제와 실질적 대안

  • 데칼은 포스터, 그래피티, 벽의 균열 등 배경을 자연스럽게 꾸미기 위해 자주 사용되는 시각적 효과다.
  • 그러나 데칼을 반투명 오브젝트(예: 유리창)에는 바로 적용할 수 없다는 문제가 있다.
  • 실제로 반투명에 적용된 것처럼 보여도, 이는 반투명 오브젝트가 아니라 바닥에 데칼이 적용된 경우다.
  • 이 문제를 해결하기 위해서는 매쉬와 데칼 머티리얼을 혼합해서 사용하는 전략이 필요하다.
  • 스태틱 매쉬(플랜)에 데칼용 머티리얼을 직접 적용하면, 데칼이 적용된 것과 매우 유사한 효과를 얻을 수 있다.

2. 🪟 데칼이 반투명 오브젝트에 적용되지 않는 근본적 이유

  • 데칼이 반투명한 질감에 적용되지 않는 이유는, 반투명 오브젝트가 신 댑스(Depth) 정보에 포함되지 않기 때문임을 확인할 수 있다.
  • 신 댑스는 카메라로부터 3D 오브젝트가 얼마나 멀리 떨어졌는지를 나타내는 값이며, 이 모드를 통해 버퍼 비주얼라이제이션에서 확인 가능하다.
  • 오페이크(Opaque)나 마스크드(Material Masked) 오브젝트는 신 댑스 값에 포함되기 때문에 데칼이 정상적으로 렌더링된다.
  • 그러나 트랜스루센트(Translucent), 즉 반투명 오브젝트는 신 댑스 값에서 제외되어 데칼의 겹치는 좌표 영역을 계산할 수 없어 데칼 적용이 되지 않는다.
  • 실험적으로, 데칼이 적용된 오브젝트를 허공에 배치하면 머티리얼만 적용된 경우와 다르게 데칼의 동작을 직접 관찰할 수 있다.

3. 🧩 매쉬 기반 데칼 적용과 G파이팅 문제

  • 트랜슬루센트(반투명) 오브젝트는 데칼의 바운딩 박스 범위와 무관하게 항상 렌더링되어 멀어져도 보인다
  • 트랜슬루센트 오브젝트의 두께가 거의 0에 가까워서 거리 변화가 시각적으로 잘 드러나지 않는다
  • 이미지가 반투명이고 글씨가 투명인 이유는 명확히 알 수 없어 추가적인 조사가 필요하다
  • 데칼 머티리얼을 매시에 적용한 경우와 일반 머티리얼을 적용한 기본 오브젝트를 비교하는 두 가지 예시가 있다
  • 트랜슬루센트 머티리얼과 오페이크(불투명) 머티리얼이 겹쳐 있으면 누가 먼저 렌더링될지 알 수 없어 G파이팅이 발생한다

4. 📝 데칼 처리 방식 및 추가 연구 방향

  • **오페이크(Opaque)**와 **데칼(Decal)**의 경우, 먼저 오브젝트를 그리고 그 위에 데칼을 덮는 명확한 순서로 인해 **깊이 파이팅(z-fighting)**이 발생하지 않는다
  • 데칼을 제한적으로 활용할 수 있으며, UV 정리에 신경을 써야 하지만 데칼을 전혀 사용하지 못하는 것보다는 낫다
  • 데칼 적용과 관련된 문제나 궁금증이 생길 경우, 이메일로 문의하면 된다

안티 앨리어싱(Anti-Aliasing)

안티 앨리어싱은 레스터라이즈(벡터 > 픽셀화) 한 이미지를 보다 부드럽게 만들어주는 기능입니다. 보통 안티 앨리어싱이 적용되지 않아서 픽셀이 끊어져 보이는 효과를 재깅(Jagging, jagged)라고 합니다. 이러한 재깅을 부드럽게 줄여주는 것을 안티앨리어싱이라고 합니다.

안티 앨리어싱의 원리

안티 앨리어싱은 렌더링 되는 과정중에 하나의 효과로 여러가지 알고리즘이 있습니다.

언리얼 엔진에서는 TSR(Temporal Super Resolution)이 PC기준으로 기본값으로 적용되어 있고, 모바일은 FXAA(Fast Approximate Anti-Aliasing)이 기본 설정으로 적용 됩니다.

유니티 엔진에서는 MSAA (Multi Sample Anti Aliasing)이 기본값으로 적용되어 있습니다.

이는 기본값으로 몇가지 선택지 중에 바꿀 수 있습니다.

안티 앨리어싱 종류와 특징

빠른 근사 안티 앨리어싱(Fast Approximate Anti Aliasing) 

TSR에도 등장하지만 종종 샘플, 혹은 샘플링이라는 표현들이 등장합니다.

이는 렌더링과 관련해서 자주 등장하게 되는 단어인데, 단순하게 설명하면 수집된 표본(데이터)라고 이해하시면 됩니다.

출처 : https://www.nvidia.com/en-us/geforce/news/multi-frame-sampled-anti-aliasing-delivers-better-performance-and-superior-image-quality/

안티 앨리어싱에 한해서 설명하자면, 재깅(지글거리는)것을 완화하기 위해서 샘플을 수집합니다. 수집되는 대상은 3D 벡터 데이터를 화면에 표현하게 되었을 때 픽셀에서 차지하는 비율이라고 보시면 됩니다. 위에 이미지 좌측 하단에 두개의 박스를 풀어보면 다음과 같습니다.

네모 박스는 픽셀을 의미합니다.

빨간 선은 벡터 이미지(3D 폴리곤)으로 빨간선을 기준으로 아래쪽에 폴리곤이 있게 됩니다. 빨간점 혹은 녹색 점은 샘플입니다.

Frame n-1을 보면 폴리곤(빨간선)이 하단 3개의 샘플에 포함되어 있습니다. 같은 색상이라도 샘플이 1개만 포함되면 옅은 흰색, 샘플 두개가 포함되면 흰색으로 폴리곤이 같은 색이라도 다르게 표현되는 것을 알 수 있습니다. 반면, Frame n 과 같이 좌측하단의 샘플에 폴리곤이 포함되지 않는다면, 블랙(0)으로 폴리곤이 없는 것처럼 처리됩니다.

불칸(Open Gl)에서도 보면 하나의 픽셀을 네개의 샘플을 수집해서 픽셀을 표현하게 되는데, 이러한 경우 MSAA x4 로 표현합니다. x는 곱하기 의미 입니다. 2개의 샘플은 x2, 6개는 x6과 같이 표기합니다. 샘플 수가 많을 수록 연산이 무겁습니다

템포럴 슈퍼 레졸루션(Temporal Super Resolution Up Scaling)

언리얼 엔진4에서 사용하던 템포럴 안티  앨리어싱 업스케일을 개선한 기능입니다.

업스케일링(낮은 해상도로 렌더링해서 높은 해상도로 보여주는) 기반으로 한 안티앨리어싱입니다.

간단하게 작동 순서를 보면 다음과 같습니다.

1. 디스플레이 해상도가 4k라면, 그보다 낮은 단계로 렌더링 합니다. 예를 들면  FHD(1920 * 1080)로 렌더링된 결과를 각종효과를 적용하고 나서 4k(3840 * 2160)으로 보여주는 것입니다.

2. 각 프레임에서 서로 다른 위치를 샘플링(분석하기 위한 픽셀 데이터 수)합니다.

3. 이전 프레임에 샘플링된 픽셀을 블렌딩(혼합) 합니다.

위에 이미지는 컴퓨터가 화면을 그리는 순서입니다. 지오메트리를 적용한 후 DOF(depth of field) 효과를 적용한 후에 Temporal Super Resolution (TSR – 녹색)이 적용됩니다.

그 후에 적용되는 많은 포스트 프로세스(후처리 시각 효과)들이 적용됩니다. 이러한 과정을 거쳐서 각진 도트를 보기 편안한 이미지로 필터링 하게 됩니다.