Hymn to Beauty
C++ 3D Engine
Renderer.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <glm/glm.hpp>
4#include <vector>
5#include "Lighting/Light.hpp"
7#include "RenderScene.hpp"
8
9namespace Utility {
10class Window;
11}
12
13namespace Video {
14class StaticRenderProgram;
15class SpriteRenderProgram;
16class Shader;
17class ShaderProgram;
18class Buffer;
19class VertexDescription;
20class GeometryBinding;
21class LowLevelRenderer;
22class CommandBuffer;
23class Texture;
24class Sampler;
25class ZBinning;
26class DebugDrawing;
27namespace Geometry {
28class Geometry3D;
29} // namespace Geometry
30
32class Renderer {
33 public:
35 enum class GraphicsAPI {
36 OPENGL,
37 VULKAN,
38 WEBGPU,
39 };
40
42
46 Renderer(GraphicsAPI graphicsAPI, Utility::Window* window);
47
49 ~Renderer();
50
52
56
58
61 const glm::uvec2& GetRenderSurfaceSize() const;
62
64 void BeginFrame();
65
67
70 void Render(const RenderScene& renderScene);
71
73 void Present();
74
76
80 void WaitForRender();
81
83
87
89
93
94 private:
95 Renderer(const Renderer& other) = delete;
96
97 void SetRenderSurfaceSize(const glm::uvec2& size);
98 void UpdateLights(const RenderScene& renderScene, const uint32_t cameraIndex);
99 std::vector<std::size_t> FrustumCulling(const RenderScene& renderScene, const RenderScene::Camera& camera);
100 void RenderDepthPrePass(const RenderScene& renderScene, const std::vector<std::size_t>& culledMeshes, const uint32_t cameraIndex);
101 void RenderOpaques(const RenderScene& renderScene, const std::vector<std::size_t>& culledMeshes, const uint32_t cameraIndex);
102 void RenderDebugShapes(const RenderScene& renderScene, const uint32_t cameraIndex);
103 void RenderIcons(const RenderScene& renderScene, const uint32_t cameraIndex);
104 void PrepareRenderingIcons(const uint32_t cameraIndex, const glm::mat4& viewProjectionMatrix, const glm::vec3& cameraPosition, const glm::vec3& cameraUp);
105 void RenderIcon(const uint32_t cameraIndex, const glm::vec3& position);
106 void RenderSprites(const RenderScene& renderScene, const uint32_t cameraIndex);
107
108 LowLevelRenderer* lowLevelRenderer;
109 Utility::Window* window;
110
111 glm::uvec2 outputSize;
112 glm::uvec2 renderSurfaceSize;
113 Texture* outputTexture;
114 Texture* colorTexture;
115 Texture* depthTexture;
116 Texture* postProcessingTexture;
117 CommandBuffer* guiCommandBuffer;
118 std::vector<CommandBuffer*> commandBuffers;
119
120 StaticRenderProgram* staticRenderProgram;
121 SpriteRenderProgram* spriteRenderProgram;
122
123 ZBinning* zBinning;
124
125 PostProcessing* postProcessing;
126
127 DebugDrawing* debugDrawing;
128
129 // Blitting (viewport).
130 Shader* blitVertexShader;
131 Shader* blitFragmentShader;
132 ShaderProgram* blitShaderProgram;
133 GraphicsPipeline* blitGraphicsPipeline[2];
134
135 Buffer* quadVertexBuffer;
136 VertexDescription* quadVertexDescription;
137 GeometryBinding* quadGeometryBinding;
138
139 const Sampler* sampler;
140
141 // Icon rendering.
142 Shader* iconVertexShader;
143 Shader* iconFragmentShader;
144 ShaderProgram* iconShaderProgram;
145 GraphicsPipeline* iconGraphicsPipeline;
146
147 glm::vec3 cameraPosition;
148 glm::vec3 cameraUp;
149};
150} // namespace Video
Definition: Window.hpp:14
A buffer containing GPU accessible data.
Definition: Buffer.hpp:8
A buffer into which rendering commands are recorded.
Definition: CommandBuffer.hpp:24
Draws debug primitives.
Definition: DebugDrawing.hpp:19
Binds together a vertex description with buffers.
Definition: GeometryBinding.hpp:8
A graphics pipeline.
Definition: GraphicsPipeline.hpp:11
Low level renderer abstracting the underlaying graphics API (OpenGL or Vulkan).
Definition: LowLevelRenderer.hpp:27
Applies post-processing effects to the rendered image.
Definition: PostProcessing.hpp:18
Handles rendering using a low-level renderer.
Definition: Renderer.hpp:32
void Present()
Display the rendered results to back buffer and swap back and front buffers.
Definition: Renderer.cpp:264
GraphicsAPI
The supported graphics APIs.
Definition: Renderer.hpp:35
CommandBuffer * GetCommandBuffer()
Get the command buffer where commands are being recorded.
Definition: Renderer.cpp:278
const glm::uvec2 & GetRenderSurfaceSize() const
Get the size of the render surface.
Definition: Renderer.cpp:170
Utility::Window * GetWindow()
Get the window the renderer is using.
Definition: Renderer.cpp:282
void BeginFrame()
Begin new frame.
Definition: Renderer.cpp:174
void WaitForRender()
Wait until rendering and presentation is done.
Definition: Renderer.cpp:274
Renderer(GraphicsAPI graphicsAPI, Utility::Window *window)
Create new renderer.
Definition: Renderer.cpp:39
void Render(const RenderScene &renderScene)
Render a scene.
Definition: Renderer.cpp:183
LowLevelRenderer * GetLowLevelRenderer()
Get the low-level renderer.
Definition: Renderer.cpp:166
~Renderer()
Destructor.
Definition: Renderer.cpp:135
Determines how a texture should be sampled.
Definition: Sampler.hpp:6
Compiles and handles a shader. Shaders should be linked together into a ShaderProgram.
Definition: Shader.hpp:8
A shader program.
Definition: ShaderProgram.hpp:11
Render program to render a sprite.
Definition: SpriteRenderProgram.hpp:20
Render program to render an entity using default shader program.
Definition: StaticRenderProgram.hpp:23
A texture.
Definition: Texture.hpp:8
Describes how a vertex buffer is accessed by a shader.
Definition: VertexDescription.hpp:8
Handles binning and tiling of lights.
Definition: ZBinning.hpp:20
Definition: AssetEditor.hpp:5
Definition: ResourceView.hpp:12
Definition: Editor.hpp:18
A camera through which the scene should be rendered.
Definition: RenderScene.hpp:54
Contains all data needed to render a scene.
Definition: RenderScene.hpp:16