- 불칸 디버깅
- 렌더독에서 불칸을 캡쳐하면 패스이름등이 나오지 않음 컬러1 뎊스1 이런식으로 나오고
- 텍스쳐도 어태치먼트 등으로 표기됨
- 아래 처럼 컬러패스 뎊스 패스 등을 보기 편한 이름으로 바꾸기
- 바로 사용할수있는 방법만 알고 싶다면 맨 아래로 가시면 됩니다


- 검색해봐도 이렇거나 관련 블로그도 존재함
- 그래서 달아주기위해 구조를 파악하던중
typedef VkResult (VKAPI_PTR *PFN_vkSetDebugUtilsObjectNameEXT)(VkDevice device, const VkDebugUtilsObjectNameInfoEXT* pNameInfo);
typedef VkResult (VKAPI_PTR *PFN_vkSetDebugUtilsObjectTagEXT)(VkDevice device, const VkDebugUtilsObjectTagInfoEXT* pTagInfo);
typedef void (VKAPI_PTR *PFN_vkQueueBeginDebugUtilsLabelEXT)(VkQueue queue, const VkDebugUtilsLabelEXT* pLabelInfo);
typedef void (VKAPI_PTR *PFN_vkQueueEndDebugUtilsLabelEXT)(VkQueue queue);
typedef void (VKAPI_PTR *PFN_vkQueueInsertDebugUtilsLabelEXT)(VkQueue queue, const VkDebugUtilsLabelEXT* pLabelInfo);
..
..
#ifndef VK_ONLY_EXPORTED_PROTOTYPES
VKAPI_ATTR void VKAPI_CALL vkQueueBeginDebugUtilsLabelEXT(
VkQueue queue,
const VkDebugUtilsLabelEXT* pLabelInfo);
#endif
#ifndef VK_ONLY_EXPORTED_PROTOTYPES
VKAPI_ATTR void VKAPI_CALL vkQueueEndDebugUtilsLabelEXT(
VkQueue queue);
#endif
#ifndef VK_ONLY_EXPORTED_PROTOTYPES
VKAPI_ATTR void VKAPI_CALL vkQueueInsertDebugUtilsLabelEXT(
VkQueue queue,
const VkDebugUtilsLabelEXT* pLabelInfo);
#endif
- 이런식으로 디버깅을 위한 함수들히 언리얼 엔진상에 한번 래핑되있는것을 보게됨
- 또한
void FVulkanCommandListContext::RHIPushEvent(const TCHAR* Name, FColor Color)
{
#if VULKAN_ENABLE_DRAW_MARKERS
if (auto CmdBeginLabel = Device->GetCmdBeginDebugLabel())
{
FTCHARToUTF8 Converter(Name);
VkDebugUtilsLabelEXT Label;
ZeroVulkanStruct(Label, VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT);
Label.pLabelName = Converter.Get();
FLinearColor LColor(Color);
Label.color[0] = LColor.R;
Label.color[1] = LColor.G;
Label.color[2] = LColor.B;
Label.color[3] = LColor.A;
CmdBeginLabel(GetCommandBufferManager()->GetActiveCmdBuffer()->GetHandle(), &Label);
}
#endif
- 위 같이 컬러나 이름을 달 수 있는 별도의 함수가 존재하는거로 확인이 되어 해당 위치에 값을 넣어봤으나 작동하지 않음
- 위같은 함수를 포함 다수의 코드에서
void FVulkanDevice::VulkanSetObjectName(VkObjectType Type, uint64_t Handle, const TCHAR* Name)
{
#if VULKAN_ENABLE_DRAW_MARKERS
if(DebugMarkers.SetDebugName)
{
FTCHARToUTF8 Converter(Name);
VkDebugUtilsObjectNameInfoEXT Info;
ZeroVulkanStruct(Info, VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT);
Info.objectType = Type;
Info.objectHandle = Handle;
Info.pObjectName = Converter.Get();
DebugMarkers.SetDebugName(Device, &Info);
}
#endif // VULKAN_ENABLE_DRAW_MARKERS
}
- 와같이 이미 작성하려는 내용이 존재하는걸 확인 이게 이미 구현이 되어있다고 생각하고
- VULKAN_ENABLE_DRAW_MARKERS 전처리 매크로를 확인해봄
VulkanConfiguration.h
// Enables logging wrappers per Vulkan call
#ifndef VULKAN_ENABLE_DUMP_LAYER
#define VULKAN_ENABLE_DUMP_LAYER 0
#endif
#define VULKAN_ENABLE_DRAW_MARKERS VULKAN_SHOULD_ENABLE_DRAW_MARKERS
#ifndef VULKAN_ENABLE_IMAGE_TRACKING_LAYER
#define VULKAN_ENABLE_IMAGE_TRACKING_LAYER 0
#endif
VulkanAndroidPlatform.h
#define VK_USE_PLATFORM_ANDROID_KHR 1
#define VULKAN_ENABLE_DUMP_LAYER 0
#define VULKAN_DYNAMICALLYLOADED 1
#define VULKAN_SHOULD_ENABLE_DRAW_MARKERS (UE_BUILD_DEVELOPMENT || UE_BUILD_DEBUG)
#define VULKAN_USE_IMAGE_ACQUIRE_FENCES 0
#define VULKAN_USE_CREATE_ANDROID_SURFACE 1
#define VULKAN_SHOULD_USE_LLM (UE_BUILD_DEBUG || UE_BUILD_DEVELOPMENT) // If enabled Vulkan will report detailed allocation statistics, overrides some tags with custom ones
#define VULKAN_SHOULD_USE_COMMANDWRAPPERS VULKAN_SHOULD_USE_LLM //LLM on Vulkan needs command wrappers to account for vkallocs
#define VULKAN_ENABLE_LRU_CACHE 1
- 위 두 매크로를 보면 이미 매크로자체는 활성화 되어있음(디버그와 디벨로 빌드에서 자동 활성화)
- 히 VULKAN_ENABLE_DRAW_MARKERS 매크로를 검색하다보면 예상대로 원래 일일히 오브젝트 이름등을 입력해야하는 코드 구조가 이미 구성이 되어있음
#if VULKAN_ENABLE_DRAW_MARKERS
inline void SetDebugName(PFN_vkSetDebugUtilsObjectNameEXT SetDebugName, VkDevice Device, VkImage Image, const char* Name)
{
VkDebugUtilsObjectNameInfoEXT Info;
ZeroVulkanStruct(Info, VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT);
Info.objectType = VK_OBJECT_TYPE_IMAGE;
Info.objectHandle = (uint64)Image;
Info.pObjectName = Name;
SetDebugName(Device, &Info);
}
#endif
- 이런식으로
- 그러다 찾게된 함수가
void FVulkanDevice::SetupDrawMarkers()
{
#if VULKAN_ENABLE_DRAW_MARKERS
if (RHI->SupportsDebugUtilsExt())
{
// HOTFIX for UE-218250: Disable vulkan draw markers to get around crash/performance issues
if (FParse::Param(FCommandLine::Get(), TEXT("forcevulkanddrawmarkers")))
{
DebugMarkers.CmdBeginDebugLabel = (PFN_vkCmdBeginDebugUtilsLabelEXT)(void*)VulkanRHI::vkGetInstanceProcAddr(RHI->GetInstance(), "vkCmdBeginDebugUtilsLabelEXT");
DebugMarkers.CmdEndDebugLabel = (PFN_vkCmdEndDebugUtilsLabelEXT)(void*)VulkanRHI::vkGetInstanceProcAddr(RHI->GetInstance(), "vkCmdEndDebugUtilsLabelEXT");
DebugMarkers.SetDebugName = (PFN_vkSetDebugUtilsObjectNameEXT)(void*)VulkanRHI::vkGetInstanceProcAddr(RHI->GetInstance(), "vkSetDebugUtilsObjectNameEXT");
}
if (DebugMarkers.CmdBeginDebugLabel && DebugMarkers.CmdEndDebugLabel && DebugMarkers.SetDebugName)
{
bDebugMarkersFound = true;
}
}
#if VULKAN_HAS_DEBUGGING_ENABLED
if (bDebugMarkersFound && GRenderDocFound)
{
// running under RenderDoc or other trace tool, so enable capturing mode
EnableDrawMarkers();
- 최종적으로 디바이스에서 활성화 되지 않았던 이유가 나와있음(사실은 디버그 레이어등 모든게 활성화는 되어있는데 라벨과 이름만 출력이 안되었던것)
- 우리가 오브젝트에 이름을 붙이고 패스에 라벨을 붙이는 함수가 여기서 호출이 되어야 하는데
- 매크로 외에 if (FParse::Param(FCommandLine::Get(), TEXT("forcevulkanddrawmarkers")))
- 이런조건이 붙어있음 커맨드라인에 forcevulkanddrawmarkers 가 붙어있어야만 라벨과 오브젝트 이름을 붙여주는 조건이 있었던것
- 결국 해당 아규먼트를 넣어서 실행하도록 처리하면 렌더독에서 눈에 익은 패스와 오브젝트 이름을 볼 수 있음

위 이미지와 같이 익숙한이름으로 렌더패스를 구분할 수 있다
렌더독에서 아규먼트 붙여서 처리하는건 현재는 안되는듯 바로 아래의 파일 추가로 진행을 해야함
이부분은 엔진버전등에따라 변경될수 있어서 위 구조기록을 남겨 버전이 달라지더라도 쉽게 파악해서 처리 할 수 있도록 준비하는 과정을 남김
- UECommandLine.txt 파일 생성 - 어느곳이든 상관이 없음 디바이스 내에서는 생성하기 어려우니 윈도우에서 생성
- 내용 붙여넣기 -> -project="../../../[프로젝트이름]/[프로젝트이름].uproject" -forcevulkanddrawmarkers 혹은 -forcevulkanddrawmarkers
- 해당 파일을
- 기기\내장 저장공간\UnrealGame\[프로젝트이름]에 저장
혹시 안된다면 안드 스튜디오에서 직접 커맨드라인 텍스트를 생성 > 그레이들 빌드(자동)

최종적으로 수정한 내용은 별거 없이 준비되어 있는 기능을 사용한것뿐
가끔 엔진코드보면 정말 이해가 안되게 작성되어 있는 코드들이 존재하는데 이것도 마찬가지
왜 기본적으로 렌더독 활성화시 자동으로 활성화되게 해두지 않았는지 궁금하고 이런부분은 안드로이드 앱 빌드하기나 렌더독 플러그인 설명서에 공지를 해두지 않았는지가 궁금함
'unreal > Unreal ETC' 카테고리의 다른 글
| [Unreal_Editor] 에디터 블루프린트 바로가기 버튼 추가 (0) | 2025.02.25 |
|---|---|
| [Unreal4]언리얼 반응형 물 제작 / Interactive water (0) | 2020.07.31 |
| [Unreal]언리얼 그래픽 옵션 제작 Game Graphic Option (1) | 2020.07.29 |