디퍼드 데칼(deferred decal)은 퍼포먼스가 더 높고 유지보수도 더 쉽습니다. 라이팅을 재계산하는 대신 GBuffer에 쓰면 다음과 같은 몇 가지 이점을 얻을 수 있습니다.
- 모든 라이트에 동일한 코드 경로가 사용되고 라이트의 수나 타입에 제한이 없기 때문에 라이트가 많아질 때의 퍼포먼스를 예측하기가 훨씬 쉬워집니다.
- 스크린 스페이스 마스크 조작으로는 어려운 이펙트(예: 젖은 표면 등)도 쉽게 구현할 수 있습니다.
데칼은 데칼의 영향을 받는 영역 주변의 박스를 렌더링하는 것으로 이루어집니다.
레벨에 데칼 추가하기
데칼을 씬에 가장 쉽게 추가하는 방법은 콘텐츠 브라우저(Content Browser) 에서 적절한 데칼 머티리얼을 선택하고 뷰포트(Viewport)에서 우클릭 후 컨텍스트 메뉴에서 액터 배치(Place Actor) 를 선택하는 것입니다. 그런 다음 트랜스포메이션 툴로 데칼의 크기를 조정하거나 방향을 바꿔주면 됩니다.

크기 조정, 타일링 및 오프세팅
이렇게 생성된 데칼은 이동과 회전 위젯을 사용하여 배치 및 회전할 수 있습니다.

비균등 스케일링 위젯은 데칼 볼륨의 너비, 높이 및 최대 표시 거리(far-plane distance)를 제어합니다.
디퍼드 데칼 프로퍼티
디퍼드 데칼에는 다음과 같은 프로퍼티가 있습니다.
항목 | 설명 |
---|---|
머티리얼(Material) | 데칼로 사용될 머티리얼을 설정합니다. |
정렬 순서(Sort Order) | 이 프로퍼티로는 여러 데칼이 스태킹된 경우 정렬되는 방식의 제어 값을 설정할 수 있습니다. 값이 높을 수록 위에 렌더링됩니다. |
정렬 값은 주의하여 설정해야 합니다. 너무 많은 데칼에 너무 높은 정렬 값을 설정하면 해당 데칼을 상태별로 정렬할 수 없어 퍼포먼스가 저하될 수 있습니다.
머티리얼 세팅
DecalBlendMode 세팅은 머티리얼 프로퍼티(디퓨즈, 스페큘러, 노멀, 오파시티 등)가 GBuffer에 적용되는 방식을 정의합니다.
오파시티는 데칼 기여를 블렌딩하는 데 사용됩니다. 효율적인 데칼은 적은 수의 GBuffer 프로퍼티만 조작합니다. 현재 최적화된 사례는 DBM_Diffuse, DBM_Specular, DBM_Emissive, DBM_Normal 모드로 표시됩니다.
항목 | 설명 |
---|---|
반투명(Translucent) | 전체 머티리얼을 블렌딩하며, GBuffer 를 업데이트합니다. 구워진 라이팅에 대해서는 작동하지 않습니다. |
스테인(Stain) | BaseColor를 조절하고 나머지를 블렌딩하며, GBuffer를 업데이트합니다. 구워진 라이팅에 대해서는 작동하지 않습니다. |
노멀(Normal) | 노멀만 블렌딩하며, GBuffer 를 업데이트합니다. 구워진 라이팅에 대해서는 작동하지 않습니다. |
이미시브(Emissive) | 애디티브 이미시브에 대해서만 사용됩니다. |
DBuffer_Translucent Color, Normal, Roughness | 비메탈에 대해 사용되며, 구워진 라이팅을 위해 DBuffer에 넣습니다. 노멀이 없으면 DBM_TranslucentNormal이 됩니다. |
DBuffer_Translucent Color | 비메탈에 대해 사용되며, 구워진 라이팅을 위해 DBuffer에 넣습니다. |
DBuffer_Translucent Color, Normal | 비메탈에 대해 사용되며, 구워진 라이팅을 위해 DBuffer에 넣습니다. 노멀이 없으면 DBM_DBuffer_Color가 됩니다. |
DBuffer_Translucent Color, Roughness | 비메탈에 대해 사용되며, 구워진 라이팅을 위해 DBuffer에 넣습니다. |
DBuffer_Translucent Normal | 비메탈에 대해 사용되며, 구워진 라이팅을 위해 DBuffer에 넣습니다. |
DBuffer_Translucent Normal, Roughness | 비메탈에 대해 사용되며, 구워진 라이팅을 위해 DBuffer에 넣습니다. 노멀이 없으면 DBM_DBuffer_Roughness가 됩니다. |
DBuffer_Translucent Roughness | 비메탈에 대해 사용되며, 구워진 라이팅을 위해 DBuffer에 넣습니다. |
볼류메트릭 디스턴스 함수(Volumetric Distance Function)(실험단계) | LightVector에 따른 오파시티의 부호 있는 디스턴스를 출력합니다. |
DBM_ScreenSpaceMask 는 현재 SSAO(앰비언트 오클루전)에 사용되는 특수 마스킹 채널에 영향을 미치는 특수한 경우입니다. 데칼이 일정 영역의 기여를 오버라이드하거나 희미하게 만들 수 있게 해줍니다.
DBM_DiffuseSpecularEmissive 는 GBuffer 채널 다수에 영향을 미치는 모드입니다.
머티리얼 블렌드 모드 역시 GBuffer 값의 블렌드 방식에 영향을 미칩니다. 따라서 디퓨즈 컬러를 곱하는 것도 가능합니다.
GBuffer 뷰 모드를 사용하여 픽셀당 저장된 GBuffer 값을 조사할 수도 있습니다.
데칼 로컬 위치는 0~1 범위의 3D 위치입니다. 이 텍스처 UV는 x 및 y 컴포넌트를 제공합니다. z 컴포넌트가 필요한 경우 CameraVector 노드를 벡터 컴포넌트 3개 모두에 연결하면 됩니다.
퍼포먼스
데칼에 의해 영향을 받는 오브젝트의 메시 복잡도는 퍼포먼스에 영향을 미치지 않습니다. 데칼 퍼포먼스는 셰이더 복잡도와 화면의 셰이더 박스 크기에 따라 달라집니다.
데칼별 퍼포먼스를 개선할 수도 있습니다. 이상적인 경우 데칼의 바운딩 박스가 작아야 픽셀별 퍼포먼스를 더 높일 수 있습니다. 이 작업은 수동으로 가능합니다. 자동화 방식도 가능하긴 하지만 뛰어난 디자이너인 경우 배치를 조정하여 퍼포먼스를 개선할 수 있습니다.
ShaderComplexity(에디터 UI 또는 'viewmode ShaderComplexity') 뷰 모드로는 픽셀 셰이딩 비용에 미치는 영향을 확인할 수 있으며, 픽셀 셰이더 비용 추정을 사용하여 다수의 데칼이 오버랩되는 위치를 축적합니다. 현재 데칼 마스킹 기능은 여기에 아무런 영향도 미치지 않습니다. 마스킹된 부분은 스텐실 하드웨어 기능을 사용하므로 비용이 작아야 합니다. 다음은 데칼이 없는 씬(왼쪽)과 있는 씬(오른쪽), 노멀 렌더링인 씬(위)과 ShaderComplexity가 활성화된 씬(아래)을 보여줍니다.

더 어두운 컬러일 수록 픽셀의 퍼포먼스 비용이 높다는 것을 알 수 있습니다. 이 같은 정보는 적절한 셰이더를 최적화하거나, 거의 보이지 않는 데칼을 제거하거나, 배치의 효율성을 높이는 데 사용할 수 있습니다.
현재 한계
- 현재는 디퍼드 데칼만 지원되며 스태틱 오브젝트에서만 작동합니다.
- 노멀 블렌딩은 현재 오브젝트를 래핑하지 않습니다.
- 스트리밍은 아직 지원되지 않으므로 텍스처가 스트리밍되지 않게 주의해야 합니다.
- 다른 오브젝트에 영향을 미치지 않는 마스킹 데칼은 완전히 구현되지 않았습니다.
2x2 블록 아티팩트 픽스
데칼은 아래 스크린샷에서와 같이 에지에 2x2 픽셀 블록 아티팩트가 발생할 수 있습니다.

이 문제를 해결하려면 'Decal Derivative' 노드를 사용하면 됩니다. 이 노드는 퍼포먼스에 큰 영향을 미치므로 신중하게 사용해야 합니다. 이 노드를 사용하면 애니소트로픽 텍스처 필터링에 필요한 데칼의 디폴트 텍스처 좌표의 X 및 Y축에서 미분을 반환하지만 2x2 픽셀 블록 아티팩트를 방지하기 위해 하드웨어의 디폴트 노드 및 DDX/DDY 노드를 사용하는 방식과는 다르게 계산됩니다.

또한 이 노드를 사용하면 영향을 받는 데칼의 아티팩트가 픽스됩니다.

현재 한계
- DecalMipmapLevel은 커스텀 UV를 지원하지 않지만 출력은 직접 수정할 수 있습니다.