Hymn to Beauty
C++ 3D Engine
ZBinning.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "Light.hpp"
4#include "Isocahedron.hpp"
5
6#include <vector>
7#include <glm/glm.hpp>
8
9namespace Video {
10
11class LowLevelRenderer;
12class Buffer;
13class CommandBuffer;
14class ComputePipeline;
15class GraphicsPipeline;
16class Shader;
17class ShaderProgram;
18
20class ZBinning {
21 public:
23 struct LightInfo {
26
29
31 uint32_t lightCount;
32
35
37 uint32_t maskCount;
38
40 uint32_t tileSize;
41
43 glm::uvec2 tiles;
44
47
49 uint32_t zBins;
50
53
55 float zNear;
56
58 float zFar;
59 };
60
62
66 ZBinning(LowLevelRenderer* lowLevelRenderer, const glm::uvec2& screenSize);
67
69 ~ZBinning();
70
72
75 void SetRenderSurfaceSize(const glm::uvec2& size);
76
78
86 void BinLights(CommandBuffer& commandBuffer, const std::vector<DirectionalLight>& directionalLights, const std::vector<Light>& lights, const glm::mat4& projectionMatrix, float zNear, float zFar);
87
89
92 const LightInfo& GetLightInfo();
93
94 private:
95 void ClearBuffers(CommandBuffer& commandBuffer);
96 void Binning(CommandBuffer& commandBuffer);
97 void Tiling(CommandBuffer& commandBuffer, const glm::mat4& projectionMatrix);
98
99 LowLevelRenderer* lowLevelRenderer;
100
101 LightInfo lightInfo;
102 bool conservativeRasterization;
103
104 static const uint32_t MAX_DIRECTIONAL_LIGHTS = 128;
105 DirectionalLight directionalLightData[MAX_DIRECTIONAL_LIGHTS];
106
107 static const uint32_t MAX_LIGHTS = 2048;
108 Light lightData[MAX_LIGHTS];
109
110 static const uint32_t TILE_MASK_BUFFER_SIZE = 8 * 1024 * 1024;
111
112 Shader* binningShader;
113 ShaderProgram* binningShaderProgram;
114 ComputePipeline* binningPipeline[2];
115 uint32_t pipelineCount = 0u;
116
117 Shader* tilingVertexShader;
118 Shader* tilingFragmentShader;
119 ShaderProgram* tilingShaderProgram;
120 GraphicsPipeline* tilingPipeline;
121 Isocahedron isocahedron;
122
123 struct TilingMatricesData {
124 glm::mat4 projectionMatrix;
125 glm::vec2 scale;
126 float invIsocahedronError;
127 };
128
129 struct TilingUniformData {
130 uint32_t tileSize;
131 uint32_t maskCount;
132 uint32_t tilesX;
133 };
134
135 glm::uvec2 screenSize;
136 glm::uvec2 tilingSize;
137
138 uint32_t msaa = 1u;
139 uint32_t msaaScale = 1u;
140};
141
142} // namespace Video
A buffer containing GPU accessible data.
Definition: Buffer.hpp:8
A buffer into which rendering commands are recorded.
Definition: CommandBuffer.hpp:24
A compute pipeline.
Definition: ComputePipeline.hpp:11
A graphics pipeline.
Definition: GraphicsPipeline.hpp:11
An isocahedron used as proxy light geometry.
Definition: Isocahedron.hpp:13
Low level renderer abstracting the underlaying graphics API (OpenGL or Vulkan).
Definition: LowLevelRenderer.hpp:27
Compiles and handles a shader. Shaders should be linked together into a ShaderProgram.
Definition: Shader.hpp:8
A shader program.
Definition: ShaderProgram.hpp:11
Handles binning and tiling of lights.
Definition: ZBinning.hpp:20
~ZBinning()
Destructor.
Definition: ZBinning.cpp:74
ZBinning(LowLevelRenderer *lowLevelRenderer, const glm::uvec2 &screenSize)
Create new Z binning.
Definition: ZBinning.cpp:18
const LightInfo & GetLightInfo()
Get the light info.
Definition: ZBinning.cpp:150
void BinLights(CommandBuffer &commandBuffer, const std::vector< DirectionalLight > &directionalLights, const std::vector< Light > &lights, const glm::mat4 &projectionMatrix, float zNear, float zFar)
Bin and tile the lights.
Definition: ZBinning.cpp:105
void SetRenderSurfaceSize(const glm::uvec2 &size)
Configure tiles based on screen size.
Definition: ZBinning.cpp:91
Definition: Editor.hpp:18
A directional light used for lighting the scene.
Definition: Light.hpp:7
A light used for lighting the scene.
Definition: Light.hpp:16
Information about the lights in a scene.
Definition: ZBinning.hpp:23
Buffer * directionalLightBuffer
Buffer containing the directional light data.
Definition: ZBinning.hpp:28
float zFar
The far plane.
Definition: ZBinning.hpp:58
Buffer * tileMaskBuffer
Buffer containing light masks for the tiles.
Definition: ZBinning.hpp:46
Buffer * zMaskBuffer
Buffer containing light masks for the z bins.
Definition: ZBinning.hpp:52
Buffer * lightBuffer
Buffer containing the spot and point light data.
Definition: ZBinning.hpp:34
uint32_t directionalLightCount
The number of directional lights.
Definition: ZBinning.hpp:25
uint32_t lightCount
The number of spot and point lights.
Definition: ZBinning.hpp:31
uint32_t zBins
The number of z-bins.
Definition: ZBinning.hpp:49
uint32_t maskCount
The number of bitmasks per z-bin/tile.
Definition: ZBinning.hpp:37
uint32_t tileSize
The size of a tile in pixels. Tiles are always square.
Definition: ZBinning.hpp:40
glm::uvec2 tiles
The number of tiles in each dimension.
Definition: ZBinning.hpp:43
float zNear
The near plane.
Definition: ZBinning.hpp:55