VEX Engine
Retro looking game engine made in vulkan mostly because i wanted to understand it better.
Loading...
Searching...
No Matches
vex::Renderer Class Reference

Class responsible for rendering the scene using Vulkan backend. More...

#include <Renderer.hpp>

Public Member Functions

 Renderer (VulkanContext &context, std::unique_ptr< VulkanResources > &resources, std::unique_ptr< VulkanPipeline > &pipeline, std::unique_ptr< VulkanPipeline > &transPipeline, std::unique_ptr< VulkanPipeline > &maskPipeline, std::unique_ptr< VulkanPipeline > &billboardTransPipeline, std::unique_ptr< VulkanPipeline > &billboardMaskedPipeline, std::unique_ptr< VulkanPipeline > &particleTransPipeline, std::unique_ptr< VulkanPipeline > &particleMaskedPipeline, std::unique_ptr< VulkanPipeline > &uiPipeline, std::unique_ptr< VulkanPipeline > &fullscreenPipeline, std::unique_ptr< VulkanPipeline > &compositePipeline, std::unique_ptr< VulkanSwapchainManager > &swapchainManager, std::unique_ptr< MeshManager > &meshManager)
 Constructor for Renderer class.
 ~Renderer ()
 Destructor for Renderer class.
bool beginFrame (glm::uvec2 renderResolution, SceneRenderData &outData)
 Prepares the frame for rendering.
void renderScene (SceneRenderData &data, const vex::Entity cameraEntity, vex::Registry &registry, int frame, const std::vector< DebugVertex > *debugLines=nullptr, bool isEditorMode=false)
 Renders the 3D scene and UI to an offscreen low-res texture.
VkDescriptorSet getImGuiTextureID (ImGUIWrapper &ui)
 Gets or creates a cached ImGui texture descriptor for the scene.
void composeFrame (SceneRenderData &data, ImGUIWrapper &ui, bool isEditorMode)
 Composes the final frame onto the Swapchain image.
void endFrame (SceneRenderData &data)
 Submits the command buffer and presents the image.

Private Member Functions

void transitionImageLayout (VkCommandBuffer cmd, VkImage image, VkImageLayout oldLayout, VkImageLayout newLayout, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkPipelineStageFlags srcStage, VkPipelineStageFlags dstStage)
 Helper function for image transition.
void issueMultiDrawIndexed (VkCommandBuffer cmd, const std::vector< VkMultiDrawIndexedInfoEXT > &commands)
 Issues a multi-draw indexed command used by transparent meshes since they are drawn triangle by triangle.
void updateScreenDescriptor (VkImageView view)
 Updates the screen descriptor.

Private Attributes

VulkanContextm_r_context
std::unique_ptr< VulkanResources > & m_p_resources
std::unique_ptr< VulkanPipeline > & m_p_pipeline
std::unique_ptr< VulkanPipeline > & m_p_transPipeline
 Standard transparent geometry pipeline.
std::unique_ptr< VulkanPipeline > & m_p_maskPipeline
 Standard masked geometry pipeline.
std::unique_ptr< VulkanPipeline > & m_p_billboardTransPipeline
 Transparent billboard rendering pipeline.
std::unique_ptr< VulkanPipeline > & m_p_billboardMaskedPipeline
 Masked billboard rendering pipeline.
std::unique_ptr< VulkanPipeline > & m_p_particleTransPipeline
 Transparent particle rendering pipeline.
std::unique_ptr< VulkanPipeline > & m_p_particleMaskedPipeline
 Masked particle rendering pipeline.
std::unique_ptr< VulkanPipeline > & m_p_uiPipeline
std::unique_ptr< VulkanPipeline > & m_p_fullscreenPipeline
std::unique_ptr< VulkanPipeline > & m_p_compositePipeline
std::unique_ptr< VulkanSwapchainManager > & m_p_swapchainManager
std::unique_ptr< MeshManager > & m_p_meshManager
std::chrono::high_resolution_clock::time_point startTime
float currentTime = 0.0f
bool basicDiag = true
std::vector< TransparentTrianglem_transparentTriangles
std::map< uint32_t, glm::mat4 > trnasMatrixes
std::vector< UiComponentm_uiObjects
std::vector< VkMultiDrawIndexedInfoEXT > m_multiDrawInfos
size_t approxTriangles = 0
SceneUBO m_sceneUBO
VkDescriptorSet m_screenDescriptorSet = VK_NULL_HANDLE
VkDescriptorSet m_crtDescriptorSet = VK_NULL_HANDLE
VkSampler m_screenSampler = VK_NULL_HANDLE
VkSampler m_linearSampler = VK_NULL_HANDLE
VkImageView m_lastUsedView = VK_NULL_HANDLE
VkDescriptorSet m_cachedImGuiDescriptor = VK_NULL_HANDLE
std::vector< std::vector< VkDescriptorSet > > m_garbageDescriptors
VkDescriptorPool m_localPool = VK_NULL_HANDLE
std::vector< RenderItemopaqueQueue
 Queue of opaque 3D objects to render.
std::vector< RenderItemmaskedQueue
 Queue of masked (alpha-cutout) 3D objects to render.
std::vector< RenderItemtransparentQueue
 Queue of transparent 3D objects to render.
std::vector< BillboardItembMaskedQueue
 Queue of masked billboards to render.
std::vector< BillboardItembTransQueue
 Queue of transparent billboards to render.
std::vector< EditorBillboardItembEditorQueue
 Queue of editor billboards to render.
std::vector< vex::EntitypMaskedQueue
 Queue of entities with masked particle emitters.
std::vector< vex::EntitypTransQueue
 Queue of entities with transparent particle emitters.
std::vector< VkBuffer > m_indirectBuffers
std::vector< VmaAllocation > m_indirectAllocations

Detailed Description

Class responsible for rendering the scene using Vulkan backend.

Definition at line 66 of file Renderer.hpp.

Constructor & Destructor Documentation

◆ Renderer()

vex::Renderer::Renderer ( VulkanContext & context,
std::unique_ptr< VulkanResources > & resources,
std::unique_ptr< VulkanPipeline > & pipeline,
std::unique_ptr< VulkanPipeline > & transPipeline,
std::unique_ptr< VulkanPipeline > & maskPipeline,
std::unique_ptr< VulkanPipeline > & billboardTransPipeline,
std::unique_ptr< VulkanPipeline > & billboardMaskedPipeline,
std::unique_ptr< VulkanPipeline > & particleTransPipeline,
std::unique_ptr< VulkanPipeline > & particleMaskedPipeline,
std::unique_ptr< VulkanPipeline > & uiPipeline,
std::unique_ptr< VulkanPipeline > & fullscreenPipeline,
std::unique_ptr< VulkanPipeline > & compositePipeline,
std::unique_ptr< VulkanSwapchainManager > & swapchainManager,
std::unique_ptr< MeshManager > & meshManager )

Constructor for Renderer class.

Initializes rendering resources such as the screen sampler, descriptor pools, and debug/indirect buffers if supported.

Parameters
VulkanContext&context - The Vulkan context.
std::unique_ptr<VulkanResources>&resources - Resource manager for textures/buffers.
std::unique_ptr<VulkanPipeline>&pipeline - Standard Opaque pipeline.
std::unique_ptr<VulkanPipeline>&transPipeline - Transparent pipeline.
std::unique_ptr<VulkanPipeline>&maskPipeline - Masked pipeline (alpha cutout).
std::unique_ptr<VulkanPipeline>&billboardTransPipeline - Transparent billboard pipeline.
std::unique_ptr<VulkanPipeline>&billboardMaskedPipeline - Masked billboard pipeline.
std::unique_ptr<VulkanPipeline>&particleTransPipeline - Transparent particle pipeline.
std::unique_ptr<VulkanPipeline>&particleMaskedPipeline - Masked particle pipeline.
std::unique_ptr<VulkanPipeline>&uiPipeline - User Interface pipeline.
std::unique_ptr<VulkanPipeline>&fullscreenPipeline - Fullscreen/Post-process pipeline.
std::unique_ptr<VulkanSwapchainManager>&swapchainManager - Swapchain manager.
std::unique_ptr<MeshManager>&meshManager - Manager for mesh buffers.

Definition at line 56 of file Renderer.cpp.

◆ ~Renderer()

vex::Renderer::~Renderer ( )

Destructor for Renderer class.

Cleans up samplers, descriptor pools, and buffers (debug/indirect).

Definition at line 167 of file Renderer.cpp.

Member Function Documentation

◆ beginFrame()

bool vex::Renderer::beginFrame ( glm::uvec2 renderResolution,
SceneRenderData & outData )

Prepares the frame for rendering.

handles Swapchain recreation (if resolution changed), waits for fences, acquires the next image, and begins the command buffer.

Parameters
glm::uvec2renderResolution - The desired resolution for the low-res render target.
SceneRenderData&outData - Output struct filled with current frame context (cmd buffer, frame index).
Returns
bool - True if frame acquisition was successful, False if swapchain needs regeneration.

Definition at line 227 of file Renderer.cpp.

◆ composeFrame()

void vex::Renderer::composeFrame ( SceneRenderData & data,
ImGUIWrapper & ui,
bool isEditorMode )

Composes the final frame onto the Swapchain image.

  • Game Mode: Draws a fullscreen quad to upscale the low-res scene texture to the window size.
  • Editor Mode: Renders the ImGui overlay which contains the scene view.
    Parameters
    SceneRenderData&data - Frame context data.
    ImGUIWrapper&ui - UI wrapper for drawing.
    boolisEditorMode - Toggles between Fullscreen Quad or ImGui composition.

Definition at line 1098 of file Renderer.cpp.

◆ endFrame()

void vex::Renderer::endFrame ( SceneRenderData & data)

Submits the command buffer and presents the image.

Submits to the Graphics Queue and calls vkQueuePresentKHR. Handles VK_ERROR_OUT_OF_DATE_KHR by triggering swapchain recreation.

Parameters
SceneRenderData&data - Frame context data.

Definition at line 1314 of file Renderer.cpp.

◆ getImGuiTextureID()

VkDescriptorSet vex::Renderer::getImGuiTextureID ( ImGUIWrapper & ui)

Gets or creates a cached ImGui texture descriptor for the scene.

Used to display the rendered scene inside an ImGui window (Editor Viewport).

Parameters
ImGUIWrapper&ui - Reference to the UI wrapper to register the texture.
Returns
VkDescriptorSet - The descriptor set handle for ImGui.

Definition at line 1073 of file Renderer.cpp.

◆ issueMultiDrawIndexed()

void vex::Renderer::issueMultiDrawIndexed ( VkCommandBuffer cmd,
const std::vector< VkMultiDrawIndexedInfoEXT > & commands )
private

Issues a multi-draw indexed command used by transparent meshes since they are drawn triangle by triangle.

Parameters
VkCommandBuffercmd - Command buffer.
conststd::vector<VkMultiDrawIndexedInfoEXT>& commands - Vector of multi-draw indexed commands.

Definition at line 1529 of file Renderer.cpp.

◆ renderScene()

void vex::Renderer::renderScene ( SceneRenderData & data,
const vex::Entity cameraEntity,
vex::Registry & registry,
int frame,
const std::vector< DebugVertex > * debugLines = nullptr,
bool isEditorMode = false )

Renders the 3D scene and UI to an offscreen low-res texture.

  1. Updates Scene UBO (View/Proj, PS1 effects like jitter/snapping).
  2. Performs frustum culling on objects.
  3. Updates Light UBOs for visible objects.
  4. Sorts objects into Opaque, Masked, and Transparent queues.
  5. Executes draw calls (using MultiDraw for transparency if supported).
  6. Renders UI components on top.
    Parameters
    SceneRenderData&data - Frame context data.
    constvex::Entity cameraEntity - The active camera entity.
    vex::Registry&registry - ECS registry to query objects.
    intframe - Current frame number (used for animations/logic).
    conststd::vector<DebugVertex>* debugLines - Optional debug lines to draw.
    boolisEditorMode - If true, applies editor-specific logic (e.g. gizmos, override camera).

Definition at line 345 of file Renderer.cpp.

◆ transitionImageLayout()

void vex::Renderer::transitionImageLayout ( VkCommandBuffer cmd,
VkImage image,
VkImageLayout oldLayout,
VkImageLayout newLayout,
VkAccessFlags srcAccessMask,
VkAccessFlags dstAccessMask,
VkPipelineStageFlags srcStage,
VkPipelineStageFlags dstStage )
private

Helper function for image transition.

Parameters
VkCommandBuffercmd - Command buffer.
VkImageimage - Image.
VkImageLayoutoldLayout - Old layout.
VkImageLayoutnewLayout - New layout.
VkAccessFlagssrcAccessMask - Source access mask.
VkAccessFlagsdstAccessMask - Destination access mask.
VkPipelineStageFlagssrcStage - Source stage.
VkPipelineStageFlagsdstStage - Destination stage.

It is used internally to transition low resolution image to window resolution.

Definition at line 1490 of file Renderer.cpp.

◆ updateScreenDescriptor()

void vex::Renderer::updateScreenDescriptor ( VkImageView view)
private

Updates the screen descriptor.

Parameters
VkImageViewview - Image view.

Definition at line 1399 of file Renderer.cpp.

Member Data Documentation

◆ approxTriangles

size_t vex::Renderer::approxTriangles = 0
private

Definition at line 214 of file Renderer.hpp.

◆ basicDiag

bool vex::Renderer::basicDiag = true
private

Definition at line 208 of file Renderer.hpp.

◆ bEditorQueue

std::vector<EditorBillboardItem> vex::Renderer::bEditorQueue
private

Queue of editor billboards to render.

Definition at line 232 of file Renderer.hpp.

◆ bMaskedQueue

std::vector<BillboardItem> vex::Renderer::bMaskedQueue
private

Queue of masked billboards to render.

Definition at line 230 of file Renderer.hpp.

◆ bTransQueue

std::vector<BillboardItem> vex::Renderer::bTransQueue
private

Queue of transparent billboards to render.

Definition at line 231 of file Renderer.hpp.

◆ currentTime

float vex::Renderer::currentTime = 0.0f
private

Definition at line 206 of file Renderer.hpp.

◆ m_cachedImGuiDescriptor

VkDescriptorSet vex::Renderer::m_cachedImGuiDescriptor = VK_NULL_HANDLE
private

Definition at line 223 of file Renderer.hpp.

◆ m_crtDescriptorSet

VkDescriptorSet vex::Renderer::m_crtDescriptorSet = VK_NULL_HANDLE
private

Definition at line 219 of file Renderer.hpp.

◆ m_garbageDescriptors

std::vector<std::vector<VkDescriptorSet> > vex::Renderer::m_garbageDescriptors
private

Definition at line 224 of file Renderer.hpp.

◆ m_indirectAllocations

std::vector<VmaAllocation> vex::Renderer::m_indirectAllocations
private

Definition at line 237 of file Renderer.hpp.

◆ m_indirectBuffers

std::vector<VkBuffer> vex::Renderer::m_indirectBuffers
private

Definition at line 236 of file Renderer.hpp.

◆ m_lastUsedView

VkImageView vex::Renderer::m_lastUsedView = VK_NULL_HANDLE
private

Definition at line 222 of file Renderer.hpp.

◆ m_linearSampler

VkSampler vex::Renderer::m_linearSampler = VK_NULL_HANDLE
private

Definition at line 221 of file Renderer.hpp.

◆ m_localPool

VkDescriptorPool vex::Renderer::m_localPool = VK_NULL_HANDLE
private

Definition at line 225 of file Renderer.hpp.

◆ m_multiDrawInfos

std::vector<VkMultiDrawIndexedInfoEXT> vex::Renderer::m_multiDrawInfos
private

Definition at line 213 of file Renderer.hpp.

◆ m_p_billboardMaskedPipeline

std::unique_ptr<VulkanPipeline>& vex::Renderer::m_p_billboardMaskedPipeline
private

Masked billboard rendering pipeline.

Definition at line 196 of file Renderer.hpp.

◆ m_p_billboardTransPipeline

std::unique_ptr<VulkanPipeline>& vex::Renderer::m_p_billboardTransPipeline
private

Transparent billboard rendering pipeline.

Definition at line 195 of file Renderer.hpp.

◆ m_p_compositePipeline

std::unique_ptr<VulkanPipeline>& vex::Renderer::m_p_compositePipeline
private

Definition at line 201 of file Renderer.hpp.

◆ m_p_fullscreenPipeline

std::unique_ptr<VulkanPipeline>& vex::Renderer::m_p_fullscreenPipeline
private

Definition at line 200 of file Renderer.hpp.

◆ m_p_maskPipeline

std::unique_ptr<VulkanPipeline>& vex::Renderer::m_p_maskPipeline
private

Standard masked geometry pipeline.

Definition at line 194 of file Renderer.hpp.

◆ m_p_meshManager

std::unique_ptr<MeshManager>& vex::Renderer::m_p_meshManager
private

Definition at line 203 of file Renderer.hpp.

◆ m_p_particleMaskedPipeline

std::unique_ptr<VulkanPipeline>& vex::Renderer::m_p_particleMaskedPipeline
private

Masked particle rendering pipeline.

Definition at line 198 of file Renderer.hpp.

◆ m_p_particleTransPipeline

std::unique_ptr<VulkanPipeline>& vex::Renderer::m_p_particleTransPipeline
private

Transparent particle rendering pipeline.

Definition at line 197 of file Renderer.hpp.

◆ m_p_pipeline

std::unique_ptr<VulkanPipeline>& vex::Renderer::m_p_pipeline
private

Definition at line 192 of file Renderer.hpp.

◆ m_p_resources

std::unique_ptr<VulkanResources>& vex::Renderer::m_p_resources
private

Definition at line 191 of file Renderer.hpp.

◆ m_p_swapchainManager

std::unique_ptr<VulkanSwapchainManager>& vex::Renderer::m_p_swapchainManager
private

Definition at line 202 of file Renderer.hpp.

◆ m_p_transPipeline

std::unique_ptr<VulkanPipeline>& vex::Renderer::m_p_transPipeline
private

Standard transparent geometry pipeline.

Definition at line 193 of file Renderer.hpp.

◆ m_p_uiPipeline

std::unique_ptr<VulkanPipeline>& vex::Renderer::m_p_uiPipeline
private

Definition at line 199 of file Renderer.hpp.

◆ m_r_context

VulkanContext& vex::Renderer::m_r_context
private

Definition at line 190 of file Renderer.hpp.

◆ m_sceneUBO

SceneUBO vex::Renderer::m_sceneUBO
private

Definition at line 216 of file Renderer.hpp.

◆ m_screenDescriptorSet

VkDescriptorSet vex::Renderer::m_screenDescriptorSet = VK_NULL_HANDLE
private

Definition at line 218 of file Renderer.hpp.

◆ m_screenSampler

VkSampler vex::Renderer::m_screenSampler = VK_NULL_HANDLE
private

Definition at line 220 of file Renderer.hpp.

◆ m_transparentTriangles

std::vector<TransparentTriangle> vex::Renderer::m_transparentTriangles
private

Definition at line 210 of file Renderer.hpp.

◆ m_uiObjects

std::vector<UiComponent> vex::Renderer::m_uiObjects
private

Definition at line 212 of file Renderer.hpp.

◆ maskedQueue

std::vector<RenderItem> vex::Renderer::maskedQueue
private

Queue of masked (alpha-cutout) 3D objects to render.

Definition at line 228 of file Renderer.hpp.

◆ opaqueQueue

std::vector<RenderItem> vex::Renderer::opaqueQueue
private

Queue of opaque 3D objects to render.

Definition at line 227 of file Renderer.hpp.

◆ pMaskedQueue

std::vector<vex::Entity> vex::Renderer::pMaskedQueue
private

Queue of entities with masked particle emitters.

Definition at line 233 of file Renderer.hpp.

◆ pTransQueue

std::vector<vex::Entity> vex::Renderer::pTransQueue
private

Queue of entities with transparent particle emitters.

Definition at line 234 of file Renderer.hpp.

◆ startTime

std::chrono::high_resolution_clock::time_point vex::Renderer::startTime
private

Definition at line 205 of file Renderer.hpp.

◆ transparentQueue

std::vector<RenderItem> vex::Renderer::transparentQueue
private

Queue of transparent 3D objects to render.

Definition at line 229 of file Renderer.hpp.

◆ trnasMatrixes

std::map<uint32_t, glm::mat4> vex::Renderer::trnasMatrixes
private

Definition at line 211 of file Renderer.hpp.


The documentation for this class was generated from the following files: