언리얼 엔진에서는 물체의 외곽선을 표현하거나 다이어그램을 만들거나 데이터를 시각화하기 위한 여러 목적으로 라인 드로잉을 만드는 다양한 방법이 있습니다. 다음은 언리얼 엔진에서 사용할 수 있는 라인 드로잉 방법의 일부입니다.
- Draw Debug Line: 이 함수는 언리얼 엔진에 내장된 함수로, 월드 좌표계에서 두 지점을 연결하는 간단한 선을 그릴 수 있습니다. 물체의 경로를 그리거나 충돌 형태를 시각화하는 등 디버깅 목적으로 자주 사용됩니다. DrawDebugLine()을 사용하려면 시작점과 끝점, 선의 색상과 두께를 지정해서 호출하면 됩니다.
- Material Line Drawing: 이 방법은 재질을 사용하여 더 복잡한 라인 드로잉을 만드는 방법입니다. 커스텀 재질을 만들고 메시나 다른 물체에 적용하여 Dashed 라인, Gradient 라인, 애니메이션 라인 등 다양한 라인 효과를 만들 수 있습니다. 라인 드로잉용 재질을 만들려면 Material Editor에서 Line Gradient 노드나 관련 노드를 사용할 수 있습니다.
- Post-Process Line Drawing: 이 방법은 최종 렌더링된 이미지에 적용되는 포스트 프로세스 효과로 라인 드로잉을 만드는 것입니다. 커스텀 포스트 프로세스 재질을 사용하여 깊이 기반 아웃라인, 엣지 검출, 스타일 라인 등 다양한 라인 효과를 만들 수 있습니다. 포스트 프로세스용 라인 드로잉 재질을 만들려면 Material Editor에서 CustomStencil과 CustomDepth 노드를 사용할 수 있습니다.
- Blueprint Line Drawing: 이 방법은 블루프린트 비주얼 스크립트를 사용하여 라인 드로잉을 만드는 것입니다. Draw Debug Line과 Draw Debug Box와 같은 노드를 사용하여 디버깅이나 프로토타이핑 목적으로 라인 드로잉을 만들 수 있습니다. 블루프린트 스크립팅을 사용하여 사용자 정의 라인 드로잉 함수를 만들어 여러 블루프린트에서 재사용할 수도 있습니다.
DrawDebugLine
DrawDebugLine은 디버깅 목적으로 개발 중에 게임 월드에 선을 그리는 함수입니다. 충돌 감지 및 기타 게임 메커니즘 디버깅에 자주 사용됩니다. DrawDebugLine을 사용하면, 선의 시작점과 끝점뿐만 아니라 색상과 두께와 같은 다른 매개변수도 지정할 수 있습니다. 디버깅 중에 이 함수를 호출하면 선이 지정된 지점을 나타내는 게임 세계에 그려집니다.
그러나 DrawDebugLine은 개발 중에만 사용해야 하며 런타임 중에는 사용하지 않아야 합니다. 런타임 중에 선을 그리는 것은 게임 성능과 정확성에 부정적인 영향을 미칠 수 있기 때문입니다. DrawDebugLine을 효과적으로 사용하려면 프로젝트의 구체적인 요구 사항을 고려해야 하며 이 함수를 빈번하게 사용하지 않아야 합니다. 다음은 DrawDebugLine함수에 관한 주요한 고려사항들에 대해 살펴보겠습니다.
성능
Draw Debug Line은 언리얼 엔진의 편리한 내장 함수이지만, 특정 상황에서 성능 문제가 발생할 수 있습니다. 다음은 Draw Debug Line이 성능에 영향을 미칠 수 있는 몇 가지 이유입니다.
- 과도한 사용: Draw Debug Line을 너무 자주 사용하면 렌더링 파이프라인에 불필요한 드로우 호출을 추가하여 성능에 영향을 미칠 수 있습니다. 특히 Draw Debug Line을 모든 프레임에 호출하거나 대량의 물체에 대해 호출하는 경우 문제가 발생할 수 있습니다. 이러한 문제를 방지하기 위해서는 Draw Debug Line 호출을 절약하고 디버깅 목적으로만 사용해야 합니다.
- 가시성: Draw Debug Line은 거리나 가려짐 여부와 관계없이 장면에서 모든 카메라에서 볼 수 있습니다. 이는 장면에서 많은 수의 Draw Debug Line이 있으면 멀리서도 볼 수 있고 성능에 영향을 미칠 수 있다는 것을 의미합니다. 이러한 문제를 완화하기 위해서는 조건 검사를 사용하여 카메라의 시야 프러스텀 내에 있거나 특정 거리 내에 있는 경우에만 Draw Debug Line을 그리도록 설정할 수 있습니다.
- 플랫폼: Draw Debug Line은 서로 다른 플랫폼에서 다른 성능 특성을 가질 수 있습니다. 예를 들어, 모바일 기기나 콘솔에서는 데스크탑 컴퓨터보다 느릴 수 있습니다. 대상 플랫폼에서 최적의 성능을 보장하기 위해서는 Draw Debug Line을 활성화하고 성능 프로파일링을 수행하여 병목 현상을 식별해야 합니다.
Draw Debug Line은 디버깅에 유용한 도구이지만, 성능에 미치는 영향을 고려하여 신중하게 사용해야 합니다. 더 복잡하고 성능적으로 우수한 라인을 그려야 할 때는, 특정 요구 사항에 따라 Material Line Drawing 또는 Post-Process Line Drawing과 같은 다른 라인 드로잉 방법을 사용해야 합니다.
DrawDebugLine 의 동작 방식
코드에서 Draw Debug Line을 호출하면 새로운 디버그 라인 요청을 만들어 대기 중인 디버그 드로우 요청 목록에 추가합니다.
렌더링 과정 중에 엔진의 렌더링 스레드가 대기 중인 디버그 드로우 요청을 처리합니다. 엔진은 대기 중인 디버그 드로우 요청 목록을 반복하고 시작점과 끝점, 색상 및 두께 정보를 사용하여 각 요청에 대한 새로운 라인 프리미티브를 만듭니다. 그런 다음 라인 프리미티브는 그려질 라인의 배치에 추가됩니다.
대기 중인 모든 디버그 드로우 요청이 처리된 후, 엔진은 현재 프레임의 일부로 라인 배치를 렌더링합니다. 라인은 현재 렌더링 설정을 사용하여 그려지며, 장면의 모든 카메라에서 볼 수 있습니다.
Draw Debug Line은 디버깅에 편리한 함수이지만, 성능에 영향을 미치지 않도록 신중하게 사용해야 합니다. Draw Debug Line을 과도하게 사용하면 많은 수의 드로우 호출이 발생하여 렌더링 파이프라인이 느려지고 전반적인 성능이 감소할 수 있습니다.
DrawDebugLine 의 구현 방식
Unreal Engine에서 엔진의 문서와 소스 코드는 이 문제에 대한 정보를 제공합니다.
언리얼 엔진 문서는 Draw Debug Line을 디버깅 목적으로 두 지점 사이에 간단한 선을 그리는 데 사용해야 함을설명하고 있습니다.
또한 Draw Debug Line이 별도의 디버그 드로우 렌더링 경로를 사용하며, 이는 주요 드로우 렌더링 경로와 별도로 처리된다는 사실을 언급합니다.
Draw Debug Line의 소스 코드는 엔진의 소스 코드 저장소에있는 DrawDebugHelpers.cpp 파일에서 찾을 수 있습니다. 이 파일에는 Draw Debug Line 함수의 구현뿐만 아니라 Draw Debug Box 및 Draw Debug Sphere와 같은 다른 디버그 드로우 함수도 포함되어 있습니다.
다음은 DrawDebugLine()의 소스 코드입니다:
// \Engine\Source\Runtime\Engine\Private\DrawDebugHelpers.cpp
void DrawDebugLine(const UWorld* InWorld, FVector const& LineStart, FVector const& LineEnd, FColor const& Color, bool bPersistentLines, float LifeTime, uint8 DepthPriority, float Thickness)
{
if (GEngine->GetNetMode(InWorld) != NM_DedicatedServer)
{
// this means foreground lines can't be persistent
if (ULineBatchComponent* const LineBatcher = GetDebugLineBatcher(InWorld, bPersistentLines, LifeTime, (DepthPriority == SDPG_Foreground)))
{
float const LineLifeTime = GetDebugLineLifeTime(LineBatcher, LifeTime, bPersistentLines);
LineBatcher->DrawLine(LineStart, LineEnd, Color, DepthPriority, Thickness, LineLifeTime);
}
}
else
{
UE_DRAW_SERVER_DEBUG_ON_EACH_CLIENT(DrawDebugLine, LineStart, LineEnd, AdjustColorForServer(Color), bPersistentLines, LifeTime, DepthPriority, Thickness);
}
}
다음은 LineBatchComponent의 소스 코드입니다.
// \Engine\Source\Runtime\Engine\Private\Components\LineBatchComponent.cpp
void ULineBatchComponent::DrawLine(const FVector& Start, const FVector& End, const FLinearColor& Color, uint8 DepthPriority, const float Thickness, const float LifeTime)
{
new(BatchedLines) FBatchedLine(Start, End, Color, LifeTime, Thickness, DepthPriority);
// LineBatcher and PersistentLineBatcher components will be updated at the end of UWorld::Tick
MarkRenderStateDirty();
}
위의 소스 코드에서 알수 있듯이, Draw Debug Line이 호출되면 새로운 디버그 라인 요청을 만들고 대기 중인 디버그 드로우 요청 목록에 추가한다는 것을 확인할 수 있습니다. 이러한 요청은 주요 렌더링 경로와 별도로 처리되며, 디버그 드로잉 전용 렌더링 경로를 사용하여 그려집니다.
언리얼 엔진의 렌더링 경로
별도의 디버그 드로우 렌더링 경로를 사용함으로써, Draw Debug Line은 주요 드로우 렌더링 경로의 성능에 영향을 미치지 않고 디버깅 목적으로 사용할 수 있습니다. 그러나 여전히 과도한 드로우 호출을 피하기 위해 신중하게 사용해야합니다. 이러한 호출은 성능에 영향을 미칠 수 있습니다.
결론
DrawDebugLine은 개발 중 디버깅에 유용한 도구이지만 조심해서 사용해야하며 런타임 중에는 사용하지 않아야 합니다. 대신 개발자는 로깅, 브레이크 포인트, 유닛 테스트와 같은 대체 방법을 사용하여 게임의 성능에 영향을 미치지 않고 런타임 중에 디버깅을 할 수 있습니다.
한편, 3D 개발자들은 런타임에 사용할 Line 드로잉 기능을 위해 DrawDebugLine 대신 특정 프로젝트의 요구 사항에 맞는 자체 라인 드로잉 방법을 고려할 필요가 있습니다. DrawDebugLine은 개발 중에 라인을 그리는 데 자주 사용되는 함수이지만 모든 프로젝트에 적합하지 않을 수 있습니다. 예를 들어, 프로젝트에서 대량의 라인을 그려야하는 경우 성능에 부정적인 영향을 미치지 않도록 성능을 최적화해야합니다.
한편으로 사용자 지정 라인 드로잉 방법을 만드는 것은 라인의 모양에 대한 더 큰 제어력과 유연성을 제공할 수 있습니다. 즉, DrawDebugLine의 기본 설정에 제한되지 않고 개발자는 게임의 미적 요소와 일치하도록 라인의 색상, 두께 및 스타일을 선택할 수 있습니다.
결론적으로 런타임을 위해서 DrawDebugLine 대신 사용자 지정 라인 드로잉 방법을 만드는 것은 3D 개발자에게 더 큰 제어력과 유연성을 제공할 수 있습니다.
'Unreal Engine' 카테고리의 다른 글
여러 객체를 대상으로 카메라 전환하는 방법 (Unreal Engine, C++) (0) | 2023.04.22 |
---|---|
두께를 가진 Polyline을 Procedural Mesh로 생성하는 방법 (Unreal Engine, C++) (0) | 2023.04.01 |
Unreal Engine(C++)에서 Material을 로드하는 방법 (0) | 2023.03.15 |
정다각형(N-gon)을 Procedural Mesh로 생성하는 방법 (Unreal Engine, C++) (0) | 2023.03.14 |
Unreal Engine(C++)에서 Actor와 Component 찾는 방법 (0) | 2023.03.12 |