VisualizeTexture
VisualizeTexture
#Overview
name: VisualizeTexture
This variable is created as a Console Variable (cvar).
- type:
Cmd
- help:
To visualize internal textures
It is referenced in 10
C++ source files.
#Summary
#Usage in the C++ source code
The purpose of VisualizeTexture is to provide a debugging tool for visualizing internal textures in Unreal Engine 5. This feature is primarily used for rendering and graphics debugging.
VisualizeTexture is relied upon by several Unreal Engine subsystems and modules, including:
- The Niagara plugin, specifically for GPU compute debugging
- The RenderCore module, for general texture visualization
- The Renderer module, for executing visualization commands
The value of this variable is not set directly, but rather it’s used as a command or function name in various parts of the engine. It’s invoked through console commands or debugging tools.
VisualizeTexture interacts with other variables and systems, such as:
- RDG (Render Dependency Graph) textures and builders
- Scene views and render targets
- Various shader parameters and pipelines
Developers should be aware that:
- This is a debugging tool and should not be used in production builds
- It may have performance implications when used
- It’s primarily designed for internal engine use and may require deep understanding of UE5’s rendering system
Best practices when using VisualizeTexture include:
- Use it only during development and debugging phases
- Be cautious of its impact on performance, especially with large or complex textures
- Familiarize yourself with the various options and parameters it accepts to get the most useful visualizations
- Use it in conjunction with other debugging tools and methods for a comprehensive understanding of rendering issues
When invoking VisualizeTexture, developers can specify various parameters such as texture attributes, display size, and preview range to customize the visualization output.
#References in C++ code
#Callsites
This variable is referenced in the following C++ source code:
#Loc: <Workspace>/Engine/Plugins/FX/Niagara/Source/Niagara/Private/NiagaraGpuComputeDebug.cpp:269
Scope (from outer to inner):
file
function void FNiagaraGpuComputeDebug::DrawDebug
Source code excerpt:
Location.Y -= DisplayHeight;
NiagaraDebugShaders::VisualizeTexture(GraphBuilder, View, Output, Location, DisplayHeight, VisualizeEntry.AttributesToVisualize, GraphBuilder.RegisterExternalTexture(VisualizeEntry.Texture), VisualizeEntry.NumTextureAttributes, TickCounter, VisualizeEntry.PreviewDisplayRange);
Location.Y -= FontHeight;
AddDrawCanvasPass(GraphBuilder, {}, View, Output,
[Location, SourceName=VisualizeEntry.SourceName.ToString(), SystemName, Font](FCanvas& Canvas)
{
#Loc: <Workspace>/Engine/Plugins/FX/Niagara/Source/NiagaraShader/Private/NiagaraDebugShaders.cpp:296
Scope (from outer to inner):
file
function BEGIN_SHADER_PARAMETER_STRUCT
Source code excerpt:
}
void NiagaraDebugShaders::VisualizeTexture(
class FRDGBuilder& GraphBuilder, const FSceneView& View, const FScreenPassRenderTarget& Output,
const FIntPoint& Location, const int32& DisplayHeight,
const FIntVector4& InAttributesToVisualize, FRDGTextureRef Texture, const FIntVector4& NumTextureAttributes, uint32 TickCounter,
const FVector2D& PreviewDisplayRange
)
{
#Loc: <Workspace>/Engine/Plugins/FX/Niagara/Source/NiagaraShader/Public/NiagaraDebugShaders.h:24
Scope (from outer to inner):
file
namespace NiagaraDebugShaders
Source code excerpt:
);
NIAGARASHADER_API void VisualizeTexture(
class FRDGBuilder& GraphBuilder, const FSceneView& View, const FScreenPassRenderTarget& Output,
const FIntPoint& Location, const int32& DisplayHeight,
const FIntVector4& AttributesToVisualize, FRDGTextureRef Texture, const FIntVector4& NumTextureAttributes, uint32 TickCounter,
const FVector2D& PreviewDisplayRange = FVector2D::ZeroVector
);
}
#Loc: <Workspace>/Engine/Source/Runtime/Core/Private/HAL/ConsoleManager.cpp:3352
Scope (from outer to inner):
file
function void CreateConsoleVariables
Source code excerpt:
// the following commands are common exec commands that should be added to auto completion (todo: read UnConsole list in ini, discover all exec commands)
IConsoleManager::Get().RegisterConsoleCommand(TEXT("VisualizeTexture"), TEXT("To visualize internal textures"), ECVF_Cheat);
IConsoleManager::Get().RegisterConsoleCommand(TEXT("Vis"), TEXT("short version of visualizetexture"), ECVF_Cheat);
IConsoleManager::Get().RegisterConsoleCommand(TEXT("VisRT"), TEXT("GUI for visualizetexture"), ECVF_Cheat);
IConsoleManager::Get().RegisterConsoleCommand(TEXT("HighResShot"), TEXT("High resolution screenshots ResolutionX(int32)xResolutionY(int32) Or Magnification(float) [CaptureRegionX(int32) CaptureRegionY(int32) CaptureRegionWidth(int32) CaptureRegionHeight(int32) MaskEnabled(int32) DumpBufferVisualizationTargets(int32) CaptureHDR(int32)]\nExample: HighResShot 500x500 50 50 120 500 1 1 1"), ECVF_Cheat);
IConsoleManager::Get().RegisterConsoleCommand(TEXT("DumpUnbuiltLightInteractions"), TEXT("Logs all lights and primitives that have an unbuilt interaction."), ECVF_Cheat);
IConsoleManager::Get().RegisterConsoleCommand(TEXT("Stat MapBuildData"), TEXT(""), ECVF_Cheat);
IConsoleManager::Get().RegisterConsoleCommand(TEXT("r.ResetViewState"), TEXT("Reset some state (e.g. TemporalAA index) to make rendering more deterministic (for automated screenshot verification)"), ECVF_Cheat);
#Loc: <Workspace>/Engine/Source/Runtime/RenderCore/Private/VisualizeTexture.cpp:821
Scope (from outer to inner):
file
function void FVisualizeTexture::CreateContentCapturePass
Source code excerpt:
IFileManager::Get().MakeDirectory(*FPaths::ScreenShotDir(), true);
const FString Filename(FPaths::ScreenShotDir() / TEXT("VisualizeTexture"));
uint32 ExtendXWithMSAA = Bitmap.Num() / Extent.Y;
// Save the contents of the array to a bitmap file. (24bit only so alpha channel is dropped)
FFileHelper::CreateBitmap(*Filename, ExtendXWithMSAA, Extent.Y, Bitmap.GetData());
UE_LOG(LogRendererCore, Display, TEXT("Content was saved to \"%s\""), *FPaths::ScreenShotDir());
}
else
{
UE_LOG(LogRendererCore, Error, TEXT("Failed to save BMP for VisualizeTexture, format or texture type is not supported"));
}
});
}
}
TOptional<uint32> FVisualizeTexture::ShouldCapture(const TCHAR* InName, uint32 InMipIndex)
{
TOptional<uint32> CaptureId;
uint32& VersionCount = VersionCountMap.FindOrAdd(InName);
if (!Requested.Name.IsEmpty() && Requested.Name == InName)
{
if (!Requested.Version || VersionCount == Requested.Version.GetValue())
{
CaptureId = VersionCount;
}
}
++VersionCount;
return CaptureId;
}
#Loc: <Workspace>/Engine/Source/Runtime/RenderCore/Public/RenderGraphBuilder.h:112
Scope (from outer to inner):
file
class class FRDGBuilder
Source code excerpt:
* the graph, at which point it is released. The underlying RHI texture lifetime is only guaranteed for passes which
* declare the texture in the pass parameter struct. The name is the name used for GPU debugging tools and the the
* VisualizeTexture/Vis command.
*/
RENDERCORE_API FRDGTextureRef CreateTexture(const FRDGTextureDesc& Desc, const TCHAR* Name, ERDGTextureFlags Flags = ERDGTextureFlags::None);
/** Create graph tracked buffer from a descriptor. The CPU memory is guaranteed to be valid through execution of
* the graph, at which point it is released. The underlying RHI buffer lifetime is only guaranteed for passes which
* declare the buffer in the pass parameter struct. The name is the name used for GPU debugging tools.
*/
RENDERCORE_API FRDGBufferRef CreateBuffer(const FRDGBufferDesc& Desc, const TCHAR* Name, ERDGBufferFlags Flags = ERDGBufferFlags::None);
/** A variant of CreateBuffer where users supply NumElements through a callback. This allows creating buffers with
#Loc: <Workspace>/Engine/Source/Runtime/RenderCore/Public/RendererInterface.h:481
Scope: file
Source code excerpt:
/**
* Render thread side, use TRefCountPtr<IPooledRenderTarget>, allows sharing and VisualizeTexture
*/
struct IPooledRenderTarget
{
virtual ~IPooledRenderTarget() {}
/** Checks if the reference count indicated that the rendertarget is unused and can be reused. */
virtual bool IsFree() const = 0;
#Loc: <Workspace>/Engine/Source/Runtime/RenderCore/Public/VisualizeTexture.h:165
Scope (from outer to inner):
file
class class FVisualizeTexture : public FRenderResource
function FCaptured
Source code excerpt:
FCaptured()
{
Desc.DebugName = TEXT("VisualizeTexture");
}
TRefCountPtr<IPooledRenderTarget> PooledRenderTarget;
FRDGTextureRef Texture = nullptr;
FPooledRenderTargetDesc Desc;
EInputValueMapping InputValueMapping = EInputValueMapping::Color;
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/Renderer.cpp:620
Scope (from outer to inner):
file
function static bool RendererExec
Source code excerpt:
{
#if SUPPORTS_VISUALIZE_TEXTURE
if (FParse::Command(&Cmd, TEXT("VisualizeTexture")) || FParse::Command(&Cmd, TEXT("Vis")))
{
VisualizeTextureExec(Cmd, Ar);
return true;
}
#endif //SUPPORTS_VISUALIZE_TEXTURE
#if !(UE_BUILD_SHIPPING || UE_BUILD_TEST)
#Loc: <Workspace>/Engine/Source/Runtime/Renderer/Private/ShadowSetup.cpp:5958
Scope: file
Source code excerpt:
}
// for easier use of "VisualizeTexture"
TCHAR* const GetTranslucencyShadowTransmissionName(uint32 Id)
{
// (TCHAR*) for non VisualStudio
switch(Id)
{
case 0: return (TCHAR*)TEXT("TranslucencyShadowTransmission0");