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* commandBuffer;
118
119 StaticRenderProgram* staticRenderProgram;
120 SpriteRenderProgram* spriteRenderProgram;
121
122 ZBinning* zBinning;
123
124 PostProcessing* postProcessing;
125
126 DebugDrawing* debugDrawing;
127
128 // Blitting (viewport).
129 Shader* blitVertexShader;
130 Shader* blitFragmentShader;
131 ShaderProgram* blitShaderProgram;
132 GraphicsPipeline* blitGraphicsPipeline[2];
133
134 Buffer* quadVertexBuffer;
135 VertexDescription* quadVertexDescription;
136 GeometryBinding* quadGeometryBinding;
137
138 const Sampler* sampler;
139
140 // Icon rendering.
141 Shader* iconVertexShader;
142 Shader* iconFragmentShader;
143 ShaderProgram* iconShaderProgram;
144 GraphicsPipeline* iconGraphicsPipeline;
145
146 glm::vec3 cameraPosition;
147 glm::vec3 cameraUp;
148};
149} // 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:247
GraphicsAPI
The supported graphics APIs.
Definition: Renderer.hpp:35
CommandBuffer * GetCommandBuffer()
Get the command buffer where commands are being recorded.
Definition: Renderer.cpp:261
const glm::uvec2 & GetRenderSurfaceSize() const
Get the size of the render surface.
Definition: Renderer.cpp:167
Utility::Window * GetWindow()
Get the window the renderer is using.
Definition: Renderer.cpp:265
void BeginFrame()
Begin new frame.
Definition: Renderer.cpp:171
void WaitForRender()
Wait until rendering and presentation is done.
Definition: Renderer.cpp:257
Renderer(GraphicsAPI graphicsAPI, Utility::Window *window)
Create new renderer.
Definition: Renderer.cpp:39
void Render(const RenderScene &renderScene)
Render a scene.
Definition: Renderer.cpp:180
LowLevelRenderer * GetLowLevelRenderer()
Get the low-level renderer.
Definition: Renderer.cpp:163
~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