OpenGothic
Open source reimplementation of Gothic I and II
Loading...
Searching...
No Matches
renderer.h
Go to the documentation of this file.
1#pragma once
2
3#include <Tempest/RenderPipeline>
4#include <Tempest/CommandBuffer>
5#include <Tempest/Matrix4x4>
6#include <Tempest/Widget>
7#include <Tempest/Device>
8#include <Tempest/UniformBuffer>
9#include <Tempest/VectorImage>
10
11#include "worldview.h"
12#include "shaders.h"
13
14class Camera;
15class InventoryMenu;
16class VideoWidget;
17
18class Renderer final {
19 public:
20 Renderer(Tempest::Swapchain& swapchain);
21 ~Renderer();
22
23 void resetSwapchain();
24 void onWorldChanged();
25
26 void draw(Tempest::Encoder<Tempest::CommandBuffer>& cmd, uint8_t cmdId, size_t imgId,
27 Tempest::VectorImage::Mesh& uiLayer, Tempest::VectorImage::Mesh& numOverlay,
28 InventoryMenu &inventory, VideoWidget& video);
29
30 void dbgDraw(Tempest::Painter& painter);
31
32 Tempest::Attachment screenshoot(uint8_t frameId);
33
34 private:
35 enum Quality : uint8_t {
36 None,
37 VolumetricLQ,
38 VolumetricHQ,
39 Epipolar,
40 PathTrace,
41 };
42 Tempest::Size internalResolution() const;
43 float internalResolutionScale() const;
44 void updateCamera(const Camera &camera);
45
46 bool requiresTlas() const;
47
48 Tempest::StorageImage& usesImage2d(Tempest::StorageImage& ret, Tempest::TextureFormat frm, uint32_t w, uint32_t h, bool mips = false);
49 Tempest::StorageImage& usesImage2d(Tempest::StorageImage& ret, Tempest::TextureFormat frm, Tempest::Size sz, bool mips = false);
50 Tempest::StorageImage& usesImage3d(Tempest::StorageImage& ret, Tempest::TextureFormat frm, uint32_t w, uint32_t h, uint32_t d, bool mips = false);
51 Tempest::ZBuffer& usesZBuffer(Tempest::ZBuffer& ret, Tempest::TextureFormat frm, uint32_t w, uint32_t h);
52 Tempest::StorageBuffer& usesSsbo(Tempest::StorageBuffer& ret, size_t size);
53 Tempest::StorageBuffer& usesScratch(Tempest::StorageBuffer& ret, size_t size);
54
55 void prepareUniforms();
56 void resetShadowmap();
57 void resetSkyFog();
58 void resetGiData();
59
60 void prepareSky (Tempest::Encoder<Tempest::CommandBuffer>& cmd, WorldView& wview);
61 void prepareSSAO (Tempest::Encoder<Tempest::CommandBuffer>& cmd, WorldView& wview);
62 void prepareFog (Tempest::Encoder<Tempest::CommandBuffer>& cmd, WorldView& wview);
63 void prepareIrradiance(Tempest::Encoder<Tempest::CommandBuffer>& cmd, WorldView& wview);
64 void prepareGi (Tempest::Encoder<Tempest::CommandBuffer>& cmd, WorldView& wview);
65 void prepareExposure (Tempest::Encoder<Tempest::CommandBuffer>& cmd, WorldView& wview);
66 void prepareEpipolar (Tempest::Encoder<Tempest::CommandBuffer>& cmd, WorldView& wview);
67
68 void drawHiZ (Tempest::Encoder<Tempest::CommandBuffer>& cmd, WorldView& view);
69 void buildHiZ (Tempest::Encoder<Tempest::CommandBuffer>& cmd);
70 void drawVsm (Tempest::Encoder<Tempest::CommandBuffer>& cmd, WorldView& view);
71 void drawRtsm (Tempest::Encoder<Tempest::CommandBuffer>& cmd, WorldView& view);
72 void drawRtsmOmni (Tempest::Encoder<Tempest::CommandBuffer>& cmd, WorldView& view);
73 void drawSwr (Tempest::Encoder<Tempest::CommandBuffer>& cmd, WorldView& view);
74 void drawGBuffer (Tempest::Encoder<Tempest::CommandBuffer>& cmd, uint8_t fId, WorldView& view);
75 void drawGWater (Tempest::Encoder<Tempest::CommandBuffer>& cmd, WorldView& view);
76 void drawShadowMap (Tempest::Encoder<Tempest::CommandBuffer>& cmd, uint8_t fId, WorldView& view);
77 void drawShadowResolve(Tempest::Encoder<Tempest::CommandBuffer>& cmd, const WorldView& view);
78 void drawLights (Tempest::Encoder<Tempest::CommandBuffer>& cmd, const WorldView& view);
79 void drawSky (Tempest::Encoder<Tempest::CommandBuffer>& cmd, const WorldView& view);
80 void drawAmbient (Tempest::Encoder<Tempest::CommandBuffer>& cmd, const WorldView& view);
81 void draw (Tempest::Attachment& result, Tempest::Encoder<Tempest::CommandBuffer>& cmd, uint8_t fId);
82 void drawTonemapping (Tempest::Attachment& result, Tempest::Encoder<Tempest::CommandBuffer>& cmd, const WorldView& wview);
83 void drawCMAA2 (Tempest::Attachment& result, Tempest::Encoder<Tempest::CommandBuffer>& cmd, const WorldView& wview);
84 void drawReflections (Tempest::Encoder<Tempest::CommandBuffer>& cmd, const WorldView& wview);
85 void drawUnderwater (Tempest::Encoder<Tempest::CommandBuffer>& cmd, const WorldView& wview);
86 void drawFog (Tempest::Encoder<Tempest::CommandBuffer>& cmd, const WorldView& wview);
87 void drawSunMoon (Tempest::Encoder<Tempest::CommandBuffer>& cmd, const WorldView& wview);
88 void drawSunMoon (Tempest::Encoder<Tempest::CommandBuffer>& cmd, const WorldView& wview, bool isSun);
89
90 void drawSwRT (Tempest::Encoder<Tempest::CommandBuffer>& cmd, const WorldView& wview);
91
92 void stashSceneAux (Tempest::Encoder<Tempest::CommandBuffer>& cmd);
93
94 void drawProbesDbg (Tempest::Encoder<Tempest::CommandBuffer>& cmd, const WorldView& wview);
95 void drawProbesHitDbg (Tempest::Encoder<Tempest::CommandBuffer>& cmd);
96 void drawVsmDbg (Tempest::Encoder<Tempest::CommandBuffer>& cmd, const WorldView& wview);
97 void drawSwrDbg (Tempest::Encoder<Tempest::CommandBuffer>& cmd, const WorldView& wview);
98 void drawRtsmDbg (Tempest::Encoder<Tempest::CommandBuffer>& cmd, const WorldView& wview);
99
100 void setupSettings();
101 void toggleGi();
102 void toggleVsm();
103 void toggleRtsm();
104
105 struct Settings {
106 const uint32_t shadowResolution = 2048;
107 bool vsmEnabled = false;
108 bool rtsmEnabled = false;
109 bool swrEnabled = false;
110 bool swrtEnabled = false;
111
112 bool zEnvMappingEnabled = false;
113 bool zCloudShadowScale = false;
114 bool zFogRadial = false;
115
116 bool giEnabled = false;
117 bool aaEnabled = false;
118
119 float zVidBrightness = 0.5;
120 float zVidContrast = 0.5;
121 float zVidGamma = 0.5;
122
123 float sunSize = 0;
124 float moonSize = 0;
125
126 float vidResIndex = 0;
127
128 float vsmMipBias = 0.25; //TODO: set to lower, eventually
129 } settings;
130
132 Tempest::Swapchain& swapchain;
133 Tempest::Matrix4x4 proj, viewProj, viewProjLwc;
134 Tempest::Matrix4x4 shadowMatrix[Resources::ShadowLayers];
135 Tempest::Matrix4x4 shadowMatrixVsm;
136 Tempest::Vec3 clipInfo;
137
138 Tempest::Attachment sceneLinear;
139 Tempest::ZBuffer zbuffer, shadowMap[Resources::ShadowLayers];
140 Tempest::ZBuffer zbufferUi;
141
142 Tempest::Attachment sceneOpaque;
143 Tempest::Attachment sceneDepth;
144
145 Tempest::Attachment gbufDiffuse;
146 Tempest::Attachment gbufNormal;
147
148 struct Shadow {
149 Tempest::RenderPipeline* directLightPso = nullptr;
150 } shadow;
151
152 struct Lights {
153 Tempest::RenderPipeline* directLightPso = nullptr;
154 } lights;
155
156 struct Sky {
157 Quality quality = Quality::None;
158
159 Tempest::TextureFormat lutRGBFormat = Tempest::TextureFormat::R11G11B10UF;
160 Tempest::TextureFormat lutRGBAFormat = Tempest::TextureFormat::RGBA16F;
161
162 bool lutIsInitialized = false;
163 Tempest::Attachment transLut, multiScatLut, viewLut, viewCldLut;
164 Tempest::StorageImage cloudsLut, fogLut3D, fogLut3DMs;
165 Tempest::StorageImage occlusionLut, irradianceLut;
166 } sky;
167
168 struct SSAO {
169 Tempest::TextureFormat aoFormat = Tempest::TextureFormat::R8;
170 Tempest::StorageImage ssaoBuf;
171 Tempest::StorageImage ssaoBlur;
172 } ssao;
173
174 struct Cmaa2 {
175 Tempest::StorageImage workingEdges;
176 Tempest::StorageBuffer shapeCandidates;
177 Tempest::StorageBuffer deferredBlendLocationList;
178 Tempest::StorageBuffer deferredBlendItemList;
179 Tempest::StorageImage deferredBlendItemListHeads;
180 Tempest::StorageBuffer controlBuffer;
181 Tempest::StorageBuffer indirectBuffer;
182 } cmaa2;
183
184 struct {
185 Tempest::StorageImage hiZ;
186 Tempest::StorageImage counter;
187 Tempest::StorageBuffer counterBuf;
188
189 bool atomicImg = false;
190 } hiz;
191
192 struct {
193 const uint32_t atlasDim = 256; // sqrt(maxProbes)
194 const uint32_t maxProbes = atlasDim*atlasDim; // 65536
195
196 Tempest::StorageBuffer voteTable, hashTable, freeList;
197 Tempest::StorageBuffer probes;
198 Tempest::StorageImage probesGBuffDiff;
199 Tempest::StorageImage probesGBuffNorm;
200 Tempest::StorageImage probesGBuffRayT;
201 Tempest::StorageImage probesLighting;
202 Tempest::StorageImage probesLightingPrev;
203 bool fisrtFrame = false;
204 } gi;
205
206 struct {
207 Tempest::StorageBuffer epipoles;
208 Tempest::StorageImage epTrace;
209 } epipolar;
210
211 const int32_t VSM_PAGE_SIZE = 128;
212 struct {
213 Tempest::StorageImage pageTbl;
214 Tempest::StorageImage pageHiZ;
215 Tempest::ZBuffer pageData;
216 Tempest::StorageBuffer pageList;
217 Tempest::StorageBuffer pageListTmp;
218 Tempest::StorageBuffer pageTblOmni;
219 Tempest::StorageBuffer visibleLights;
220
221 Tempest::StorageImage fogDbg;
222 Tempest::StorageImage vsmDbg;
223 } vsm;
224
225 struct {
226 Tempest::StorageImage outputImage;
227 Tempest::StorageImage outputImageClr;
228
229 Tempest::StorageImage pages;
230 Tempest::StorageBuffer visList;
231 Tempest::StorageBuffer posList;
232
233 Tempest::StorageImage meshTiles;
234 Tempest::StorageImage primTiles;
235
236 Tempest::StorageBuffer visibleLights;
237 Tempest::StorageBuffer drawTasks;
238 Tempest::StorageImage lightTiles;
239 Tempest::StorageImage lightBins, primTilesOmni;
240
241 Tempest::StorageImage dbg64, dbg32, dbg16, dbg8;
242 } rtsm;
243
244 struct {
245 Tempest::StorageImage outputImage;
246 } swr;
247
248 struct {
249 Tempest::StorageImage outputImage;
250 } swrt;
251
252 Tempest::TextureFormat shadowFormat = Tempest::TextureFormat::Depth16;
253 Tempest::TextureFormat zBufferFormat = Tempest::TextureFormat::Depth16;
254
255 Shaders shaders;
256 };
Tempest::StorageImage dbg32
Definition renderer.h:241
void resetSwapchain()
Definition renderer.cpp:109
Tempest::StorageImage probesGBuffRayT
Definition renderer.h:200
Tempest::StorageBuffer visList
Definition renderer.h:230
Tempest::Attachment screenshoot(uint8_t frameId)
Tempest::StorageImage probesLightingPrev
Definition renderer.h:202
void onWorldChanged()
Definition renderer.cpp:282
Tempest::StorageBuffer freeList
Definition renderer.h:196
Tempest::StorageBuffer drawTasks
Definition renderer.h:237
Tempest::StorageBuffer pageTblOmni
Definition renderer.h:218
Tempest::ZBuffer pageData
Definition renderer.h:215
Tempest::StorageImage outputImageClr
Definition renderer.h:227
Tempest::StorageImage fogDbg
Definition renderer.h:221
Tempest::StorageBuffer pageList
Definition renderer.h:216
Tempest::StorageBuffer pageListTmp
Definition renderer.h:217
bool fisrtFrame
Definition renderer.h:203
Tempest::StorageImage probesGBuffDiff
Definition renderer.h:198
Tempest::StorageBuffer counterBuf
Definition renderer.h:187
Tempest::StorageImage pageTbl
Definition renderer.h:213
Tempest::StorageImage probesGBuffNorm
Definition renderer.h:199
void dbgDraw(Tempest::Painter &painter)
Definition renderer.cpp:539
const uint32_t maxProbes
Definition renderer.h:194
Tempest::StorageImage dbg8
Definition renderer.h:241
Tempest::StorageImage counter
Definition renderer.h:186
Tempest::StorageBuffer voteTable
Definition renderer.h:196
Tempest::StorageImage lightTiles
Definition renderer.h:238
bool atomicImg
Definition renderer.h:189
Tempest::StorageBuffer probes
Definition renderer.h:197
Tempest::StorageImage vsmDbg
Definition renderer.h:222
Tempest::StorageImage dbg16
Definition renderer.h:241
Tempest::StorageImage pages
Definition renderer.h:229
Tempest::StorageImage primTilesOmni
Definition renderer.h:239
Tempest::StorageImage dbg64
Definition renderer.h:241
Tempest::StorageBuffer posList
Definition renderer.h:231
Tempest::StorageImage outputImage
Definition renderer.h:226
Tempest::StorageBuffer epipoles
Definition renderer.h:207
const uint32_t atlasDim
Definition renderer.h:193
Tempest::StorageImage primTiles
Definition renderer.h:234
Tempest::StorageBuffer visibleLights
Definition renderer.h:219
Tempest::StorageImage hiZ
Definition renderer.h:185
Tempest::StorageBuffer hashTable
Definition renderer.h:196
Tempest::StorageImage pageHiZ
Definition renderer.h:214
Tempest::StorageImage epTrace
Definition renderer.h:208
Tempest::StorageImage meshTiles
Definition renderer.h:233
Tempest::StorageImage probesLighting
Definition renderer.h:201
void draw(Tempest::Encoder< Tempest::CommandBuffer > &cmd, uint8_t cmdId, size_t imgId, Tempest::VectorImage::Mesh &uiLayer, Tempest::VectorImage::Mesh &numOverlay, InventoryMenu &inventory, VideoWidget &video)
Tempest::StorageImage lightBins
Definition renderer.h:239
@ ShadowLayers
Definition resources.h:49
Definition sky.h:12