Scene Capture Component Render Target 화질 개선

[Description]

안녕하세요.

현재 Unreal Engine에서 여러 SceneCaptureComponent2D + Render Target 기반 UI 이미지(썸네일)을 생성하고 있습니다.

외형 커스텀 레벨에서 유저가 커스텀을 마치면 완료 버튼을 누르고, 완료 버튼을 눌렀을 때 SceneCaptureComponent에 할당된 렌더 타겟을 PNG로 저장하는 구조입니다.

내부에서 Render Target 해상도를 키우기 어려운 구조이며, 가능한 범위 내에서 화질 개선을 시도하고 있습니다.

그러나 다양한 설정을 변경해도 Render Target 화질이 기대 수준까지 개선되지 않아,

엔진 차원에서 가능한 추가적인 설정 및 근본적 해결 방법이 있는지 문의 드립니다.

<br/>

[Current Setup]

  • Unreal Engine 5.6
  • 여러 Render Target(RT_rec_right, RT_rec_middle, RT_vertical, RT_horizontal)을 SceneCaptureComponent2D로 촬영하여 UI에 표시
  • 해상도 확장 시 메모리 문제로 확장이 어려움

해상도 비율 :

  • RT_horizontal: 1280*888
  • RT_rec_middle: 512*512
  • RT_rec_right: 1284*1028
  • RT_vertical: 520*1028

위 해상도 비율을 각각 5배를 해야 원하는 고화질의 이미지를 저장할 수가 있음. 그러나 메모리 문제로 불가능.

RT_rec_middle 화질 개선 전(512*512, 현재) :

[Image Removed]

RT_rec_middle 해상도 비율 * 5배(목표 화질) :

[Image Removed]

[What I Tried]

1. Anti-Aliasing 관련 개선

  • Project Settings → Anti-Aliasing Method → Temporal Super Resolution(TSR) 사용 중
  • SceneCaptureComponent → Include Anti-Aliasing 활성화
  • :right_arrow: 이미 적용되어 있어 추가 개선 없음

<br/>

2. Post Process 설정 적용

  • SceneCaptureComponent → Post Process Blend Weight = 1
  • Sharpen(0→1), Contrast 조정
  • :right_arrow: Sharpen을 올려도 화질 개선 효과 없음

<br/>

3. LOD/Primitive 설정 변경

  • View Distance / LOD: Low → High
  • Primitive Render Mode: Legacy → Render Scene Primitives
  • :right_arrow: 별다른 화질 변화 없음

<br/>

4. Render Target Format 변경

  • RTF RGBA16f:
    • 저장된 결과물을 Windows에서 열 수 없음 (“지원하지 않는 형식” 오류 발생)
  • RTF RGBA32f:
  • 결과 이미지 색상 전체가 노랗게 변함
    • :right_arrow: 실사용 불가

<br/>

5. MipMaps 비활성화

  • Render Target → Texture Settings → Mip Gen Settings = NoMipMaps
  • :right_arrow: 화질이 아주 미세하게 개선되었으나 목표 품질에는 미달

<br/>

6. 해상도 비율 높이기

  • RT_rec_right의 경우 원래 642*514 였던 사이즈를 1284*1028 으로 높이니 해상도 개선이 되었으나, 그 이상은 메모리 문제로 불가.
  • RT_horizontal, RT_vertical의 경우 2배도 메모리 문제로 불가

<br/>

[Current Issue]

위의 모든 설정을 시도해 보았으나,

원본 Render Target의 물리적 해상도를 크게 확대하지 않는 이상 선명도가 원하는 수준으로 충분히 올라오지 않는 상태입니다.

<br/>

[Questions]

  1. SceneCaptureComponent2D + Render Target 기반의 UI 이미지 생성에서, Render Target 해상도를 크게 늘리지 않고(또는 메모리 문제 없이) 화질을 개선할 수 있는 권장 방식이 있을까요?
  2. UI 캡처 Render Target의 선명도를 개선하기 위해 Epic에서 공식적으로 추천하는 세팅 조합(AA/RT Format/PostProcess 등)이 있는지 알고 싶습니다.

<br/>

[Attachment Removed]

Steps to Reproduce
[Current Setup]

  • Unreal Engine 5.6

  • 여러 Render Target(RT_rec_right, RT_rec_middle, RT_vertical, RT_horizontal)을 SceneCaptureComponent2D로 촬영

  • Export : 블루프린트에서 Kismet Rendering Library의 Export Render Target 노드 이용, png로 export

  • Mip Gen Settings : NoMipMaps

  • LOD Bias : 0

  • Texture Group : RenderTarget

  • Num Cinematic Mip Levels : 0

  • Never Stream : true

  • Address X, Y : Clamp

  • Render Target Format : RTF RGBA8 SRGB

  • Auto Generate Mips : false

해상도 비율 :​

  • RT_horizontal: 1280*888
  • RT_rec_middle: 512*512
  • RT_rec_right: 1284*1028
  • RT_vertical: 520*1028

[Attachment Removed]

안녕하세요.

질문해주신 SceneCaptureComponent2D + Render Target 기반 구조와,

현재 사용 중이신 512×512 수준의 Render Target 해상도 및 메모리 제약을 고려했을 때는,

작성해주신 각종 세팅(TSR, Post Process, Mip 설정 등)을 조정하더라도,

픽셀 수 자체의 한계 때문에 원하시는 수준의 고품질 결과물까지 끌어올리기는 어려운 상황으로 보입니다.

만약 썸네일 생성이 커스터마이징 완료 시점에 한 번 캡처하는 용도라면,

SceneCaptureComponent2D + Render Target 구성을 계속 유지해야 하는지 한 번 검토해 보시는 것을 권장드립니다.

만약 구조를 약간 변경하실 수 있다면, 예를 들어 다음과 같은 방식들을 고려해 보실 수 있을 것 같습니다.

1.별도의 프리뷰용 뷰포트(FSceneViewport + 전용 ViewportClient)를 생성하고, 해당 뷰포트에서 캐릭터를 렌더한 뒤, 픽셀을 읽어서 썸네일 이미지를 생성하는 방식

아래의 해당 방식을 사용하는 플러그인을 참고해보시면 좋을 것 같습니다.

https://www.fab.com/listings/c3f9640f\-06db\-4344\-9a8a\-ee6d09a9d8bc

2.엔진 내장 기능인 High Resolution Screenshot(HighResShot)을 활용하여, 타일 렌더링 기반으로 고해상도 스크린샷을 생성하는 방식

이러한 접근을 사용하면, 지금처럼 큰 Render Target 텍스처를 상시 유지하지 않고,

썸네일 캡처가 필요한 시점에만 높은 해상도로 렌더링하여 원하시는 품질의 이미지를 얻을 수 있다는 장점이 있습니다.

High Resolution Screenshot에 대해서는 아래 에픽 공식 문서를 함께 참고해 주시면 도움이 될 것 같습니다.

https://dev.epicgames.com/documentation/ko\-kr/unreal\-engine/taking\-screenshots\-in\-unreal\-engine

감사합니다.

[Attachment Removed]

답변 감사합니다. HighResShot 방식을 검토해보았는데, 현재 구조에서 적용하기 어려운 점이 있어 추가 문의드립니다.

## 현재 구조

캐릭터 외형 커스터마이징 레벨에서 사용자가 완료 버튼을 누르면 썸네일을 촬영합니다. 사용자에게는 로딩 화면(UI Widget)이 표시되지만, 그 뒤에서 캐릭터 썸네일을 촬영한 뒤 다음 레벨로 전환하는 구조입니다.

촬영해야 하는 썸네일은 총 4장이며, 각각 다른 구도와 해상도를 가집니다:

  • RT_horizontal 1280×888 캐릭터 중앙, 머리~엉덩이
  • RT_rec_middle 512×512 캐릭터 중앙, 얼굴 클로즈업
  • RT_rec_right 1284×1028 캐릭터 오른쪽 배치, 얼굴 클로즈업
  • RT_vertical 520×1028 캐릭터 중앙, 머리~종아리

## HighResShot 적용 시 문제점

### 1. Viewport 기반 캡처로 인한 로딩 화면 간섭

HighResShot은 현재 활성 Viewport를 캡처하는 방식으로 알고 있습니다. 사용자에게 로딩 화면이 표시되는 동안에는 캐릭터가 로딩 UI에 가려지기 때문에, 그대로 캡처하면 원하는 결과물을 얻을 수 없습니다.

질문 1: 별도의 PlayerController(또는 ViewportClient)를 생성하여 해당 Viewport만 HighResShot으로 캡처하는 방식이 가능할까요? 가능하다면 권장되는 구현 방식이 있는지 알려주시면 감사하겠습니다.

### 2. 사용자 창 비율에 따른 캡처 영역 불일치

고려한 방안:

  • 충분히 큰 해상도로 전체를 캡처한 뒤, 각 썸네일 비율에 맞게 크롭

문제점 :

  • HighResShot은 현재 Viewport 비율을 그대로 사용하기 때문에, 사용자의 창 크기/비율에 따라 캡처되는 영역이 달라집니다. 4장의 썸네일이 각각 다른 해상도 비율(1280×888, 512×512, 1284×1028, 520×1028)을 요구하므로, 일관된 결과물을 얻기 어렵습니다.
  • 얼굴 클로즈업의 경우 확대가 필요한데 다른 이미지만큼의 고화질을 보장할 수 있을지 의문입니다.

질문 2: 위 방안이 적절한지, 그리고 캡처된 이미지를 특정 비율로 크롭하여 저장하는 방법(Blueprint 또는 C++)이 있는지 알려주시면 감사하겠습니다.

감사합니다.

[Attachment Removed]

안녕하세요.

UAutomationBlueprintFunctionLibrary::TakeHighResScreenshot 함수를 참고해보시면, 해당 함수는 LevelEditorViewport 화면을 캡처하는 방식으로 구현되어 있습니다.

다만 LevelEditor 모듈에 의존하는 에디터 전용 기능이기 때문에, Shipping 빌드 환경에서는 사용하기 어려운 점이 있습니다.

이 경우에는 GameViewport 기반의 High-Resolution Screenshot 기능을 사용하실 수 있을 것 같습니다.

해당 방식으로 캡처를 진행하면 UMG/Slate 기반의 로딩 UI는 일반적으로 캡처 결과에 포함되지 않으므로, 로딩 화면이 가려져 캡처가 실패하는 문제를 피할 수 있습니다.

구현 방식은 아래와 같습니다.

  1. 구도별로 CameraActor를 레벨에 배치.
  2. 캡처 시점에 원하는 카메라를 ViewTarget으로 전환.(여러 장을 연속으로 캡처하는 경우에는 카메라 전환 후, 짧은 딜레이을 둔 뒤 캡처하시는 것을 권장드립니다.)
  3. 원하는 출력 해상도를 설정.
  4. GameViewport 화면 캡처를 진행합니다.

아래는 GameViewport에서 원하는 해상도로 HighRes 스크린샷을 찍는 예시 코드입니다.

FHighResScreenshotConfig& Config = GetHighResScreenshotConfig();
Config.SetResolution((uint32)TargetX, (uint32)TargetY, 1.0f);
Config.SetMaskEnabled(false);
Config.SetHDRCapture(false);
 
GEngine->GameViewport->Viewport->TakeHighResScreenShot();

[Image Removed](512x512, 캐릭터 중앙, 얼굴 클로즈업)

[Image Removed](1284×1028, 캐릭터 오른쪽 배치, 얼굴 클로즈업)

추가적으로, 출력 해상도의 종횡비와 카메라의 종횡비 설정이 일치하도록 설정한 후 캡처하시는 것을 권장드리며,

또한, 캡처된 파일을 원하시는 경로 및 이름으로 저장하고자 하신다면, GameViewport의 OnScreenshotCaptured(ScreenshotCapturedDelegate)를 통해 픽셀 데이터를 받아 원하는 형식으로 직접 저장하실 수 있습니다.

에픽게임즈는 12월 23일부터 1월 6일까지 겨울 휴가 기간으로, 해당 기간 동안 기술 지원이 제한될 수 있으니 이 점 양해 부탁드립니다.

감사합니다.

[Attachment Removed]