OpenGothic
Open source reimplementation of Gothic I and II
Loading...
Searching...
No Matches
shaders.cpp
Go to the documentation of this file.
1#include "shaders.h"
2
3#include <Tempest/Application>
4#include <Tempest/Device>
5#include <Tempest/Log>
6
7#include "gothic.h"
8#include "resources.h"
9
10#include "shader.h"
11#include "utils/string_frm.h"
12
13using namespace Tempest;
14
15Shaders* Shaders::instance = nullptr;
16
18 instance = this;
19 compileKeyShaders();
20 deferredCompilation = std::async(std::launch::async, [this]() {
21 Workers::setThreadName("Shader compilation");
22 auto time = Application::tickCount();
23 compileShaders();
24 time = Application::tickCount() - time;
25 if(time>1000)
26 Log::i("Shader compilation took: ",time/1000," seconds");
27 });
28 }
29
31 deferredCompilation.wait();
32 instance = nullptr;
33 }
34
36 deferredCompilation.wait();
37 }
38
40 instance->waitCompiler();
41 return *instance;
42 }
43
44void Shaders::compileKeyShaders() {
45 bink = postEffect("bink");
46 }
47
48void Shaders::compileShaders() {
49 auto& device = Resources::device();
50
51 const bool meshlets = Gothic::options().doMeshShading;
52
53 copyBuf = computeShader("copy.comp.sprv");
54 copyImg = computeShader("copy_img.comp.sprv");
55 copy = postEffect("copy");
56
57 patch = computeShader("patch.comp.sprv");
58
59 stash = postEffect("stash");
60
61 clusterInit = computeShader("cluster_init.comp.sprv");
62 clusterPatch = computeShader("cluster_patch.comp.sprv");
63 visibilityPassSh = computeShader("visibility_pass.comp.sprv");
64 visibilityPassHiZ = computeShader("visibility_pass_hiz.comp.sprv");
65 visibilityPassHiZCr = computeShader("visibility_pass_hiz_cr.comp.sprv");
66
67 ssao = computeShader("ssao.comp.sprv");
68 ssaoBlur = computeShader("ssao_blur.comp.sprv");
69
70 directLight = postEffect("direct_light", RenderState::ZTestMode::NoEqual);
71 directLightSh = postEffect("direct_light_sh", RenderState::ZTestMode::NoEqual);
72 if(Gothic::options().doRayQuery && device.properties().descriptors.nonUniformIndexing)
73 directLightRq = postEffect("direct_light_rq", RenderState::ZTestMode::NoEqual);
74
75 ambientLight = ambientLightShader("ambient_light");
76 ambientLightSsao = ambientLightShader("ambient_light_ssao");
77
78 irradiance = computeShader("irradiance.comp.sprv");
79 cloudsLut = computeShader("clouds_lut.comp.sprv");
80 skyTransmittance = postEffect("sky_transmittance");
81 skyMultiScattering = postEffect("sky_multi_scattering");
82 skyViewLut = postEffect("sky_view_lut");
83 skyViewCldLut = postEffect("sky_view_clouds_lut");
84
85 fogViewLut3d = computeShader("fog_view_lut.comp.sprv");
86 fogViewLutSep = computeShader("fog_view_lut_sep.comp.sprv");
87 fogOcclusion = computeShader("fog3d.comp.sprv");
88
89 skyExposure = computeShader("sky_exposure.comp.sprv");
90 sky = postEffect("sky");
91 skySep = postEffect("sky_sep");
92 fog = fogShader ("fog");
93 fog3dHQ = fogShader ("fog3d_hq");
94
95 {
96 RenderState state;
97 state.setCullFaceMode (RenderState::CullMode::Front);
98 state.setBlendSource (RenderState::BlendMode::One);
99 state.setBlendDest (RenderState::BlendMode::SrcAlpha);
100 state.setZTestMode (RenderState::ZTestMode::Always);
101 state.setZWriteEnabled(false);
102
103 auto sh = GothicShader::get("triangle.vert.sprv");
104 auto vsLight = device.shader(sh.data,sh.len);
105 sh = GothicShader::get("sky_pathtrace.frag.sprv");
106 auto fsLight = device.shader(sh.data,sh.len);
107 skyPathTrace = device.pipeline(Triangles, state, vsLight, fsLight);
108 }
109
110 underwaterT = inWaterShader("underwater_t", false);
111 underwaterS = inWaterShader("underwater_s", true);
112 waterReflection = reflectionShader("water_reflection.frag.sprv",meshlets);
113 waterReflectionSSR = reflectionShader("water_reflection_ssr.frag.sprv",meshlets);
114
115 {
116 RenderState state;
117 state.setCullFaceMode (RenderState::CullMode::Front);
118 state.setBlendSource (RenderState::BlendMode::One);
119 state.setBlendDest (RenderState::BlendMode::SrcAlpha);
120 state.setZTestMode (RenderState::ZTestMode::Equal);
121 state.setZWriteEnabled(false);
122
123 auto sh = GothicShader::get("sun.vert.sprv");
124 auto vsLight = device.shader(sh.data,sh.len);
125 sh = GothicShader::get("sun.frag.sprv");
126 auto fsLight = device.shader(sh.data,sh.len);
127 sun = device.pipeline(Triangles, state, vsLight, fsLight);
128 }
129
130 {
131 RenderState state;
132 state.setCullFaceMode (RenderState::CullMode::Front);
133 state.setBlendSource (RenderState::BlendMode::One);
134 state.setBlendDest (RenderState::BlendMode::One);
135 state.setZTestMode (RenderState::ZTestMode::Less);
136
137 state.setZWriteEnabled(false);
138
139 auto sh = GothicShader::get("light.vert.sprv");
140 auto vsLight = device.shader(sh.data,sh.len);
141 sh = GothicShader::get("light.frag.sprv");
142 auto fsLight = device.shader(sh.data,sh.len);
143 lights = device.pipeline(Triangles, state, vsLight, fsLight);
144 if(Gothic::options().doRayQuery) {
145 if(Resources::device().properties().descriptors.nonUniformIndexing) {
146 sh = GothicShader::get("light_rq_at.frag.sprv");
147 fsLight = device.shader(sh.data,sh.len);
148 } else {
149 sh = GothicShader::get("light_rq.frag.sprv");
150 fsLight = device.shader(sh.data,sh.len);
151 }
152 lightsRq = device.pipeline(Triangles, state, vsLight, fsLight);
153 }
155 sh = GothicShader::get("light_vsm.frag.sprv");
156 fsLight = device.shader(sh.data,sh.len);
157 lightsVsm = device.pipeline(Triangles, state, vsLight, fsLight);
158 }
159 }
160
161 tonemapping = postEffect("triangle_uv", "tonemapping", RenderState::ZTestMode::Always);
162 tonemappingUpscale = postEffect("triangle_uv", "tonemapping_up", RenderState::ZTestMode::Always);
163
164 cmaa2EdgeColor2x2Presets[uint32_t(AaPreset::OFF)] = Tempest::ComputePipeline();
165 cmaa2EdgeColor2x2Presets[uint32_t(AaPreset::MEDIUM)] = computeShader("cmaa2_edges_color2x2_quality_0.comp.sprv");
166 cmaa2EdgeColor2x2Presets[uint32_t(AaPreset::ULTRA)] = computeShader("cmaa2_edges_color2x2_quality_1.comp.sprv");
167
168 cmaa2ProcessCandidates = computeShader("cmaa2_process_candidates.comp.sprv");
169 {
170 auto sh = GothicShader::get("cmaa2_deferred_color_apply_2x2.vert.sprv");
171 auto vs = device.shader(sh.data,sh.len);
172 sh = GothicShader::get("cmaa2_deferred_color_apply_2x2.frag.sprv");
173 auto fs = device.shader(sh.data,sh.len);
174 cmaa2DeferredColorApply2x2 = device.pipeline(Tempest::Points,RenderState(),vs,fs);
175 }
176
177 hiZPot = computeShader("hiz_pot.comp.sprv");
178 hiZMip = computeShader("hiz_mip.comp.sprv");
179
180 if(Gothic::options().doRayQuery) {
181 RenderState state;
182 state.setCullFaceMode(RenderState::CullMode::NoCull);
183 state.setZTestMode (RenderState::ZTestMode::Less);
184
185 auto sh = GothicShader::get("probe_dbg.vert.sprv");
186 auto vs = device.shader(sh.data,sh.len);
187 sh = GothicShader::get("probe_dbg.frag.sprv");
188 auto fs = device.shader(sh.data,sh.len);
189 probeDbg = device.pipeline(Triangles,state,vs,fs);
190
191 sh = GothicShader::get("probe_hit_dbg.vert.sprv");
192 vs = device.shader(sh.data,sh.len);
193 sh = GothicShader::get("probe_hit_dbg.frag.sprv");
194 fs = device.shader(sh.data,sh.len);
195 probeHitDbg = device.pipeline(Triangles,state,vs,fs);
196
197 probeInit = computeShader("probe_init.comp.sprv");
198 probeClear = computeShader("probe_clear.comp.sprv");
199 probeClearHash = computeShader("probe_clear_hash.comp.sprv");
200 probeMakeHash = computeShader("probe_make_hash.comp.sprv");
201 probeVote = computeShader("probe_vote.comp.sprv");
202 probePrune = computeShader("probe_prune.comp.sprv");
203 probeAlocation = computeShader("probe_allocation.comp.sprv");
204 probeTrace = computeShader("probe_trace.comp.sprv");
205 probeLighting = computeShader("probe_lighting.comp.sprv");
206
207 state.setBlendSource (RenderState::BlendMode::One);
208 state.setBlendDest (RenderState::BlendMode::SrcAlpha); // for debugging
209 state.setZTestMode (RenderState::ZTestMode::NoEqual);
210 state.setZWriteEnabled(false);
211 sh = GothicShader::get("probe_ambient.vert.sprv");
212 vs = device.shader(sh.data,sh.len);
213 sh = GothicShader::get("probe_ambient.frag.sprv");
214 fs = device.shader(sh.data,sh.len);
215 probeAmbient = device.pipeline(Triangles,state,vs,fs);
216 }
217
219 fogEpipolarOcclusion = computeShader("fog_epipolar_occlusion.comp.sprv");
220 fogEpipolarVsm = computeShader("fog_epipolar_vsm.comp.sprv");
221 }
222
224 vsmVisibilityPass = computeShader("vsm_visibility_pass.comp.sprv");
225 vsmClear = computeShader("vsm_clear.comp.sprv");
226 vsmClearOmni = computeShader("vsm_clear_omni.comp.sprv");
227 vsmCullLights = computeShader("vsm_cull_lights.comp.sprv");
228 vsmMarkPages = computeShader("vsm_mark_pages.comp.sprv");
229 vsmMarkOmniPages = computeShader("vsm_mark_omni_pages.comp.sprv");
230 vsmPostprocessOmni = computeShader("vsm_postprocess_omni.comp.sprv");
231 vsmTrimPages = computeShader("vsm_trim_pages.comp.sprv");
232 vsmClumpPages = computeShader("vsm_clump_pages.comp.sprv");
233 vsmListPages = computeShader("vsm_list_pages.comp.sprv");
234 vsmSortPages = computeShader("vsm_sort_pages.comp.sprv");
235 vsmAllocPages = computeShader("vsm_alloc_pages.comp.sprv");
236 vsmAlloc2Pages = computeShader("vsm_alloc_pages2.comp.sprv");
237 vsmMergePages = computeShader("vsm_merge_pages.comp.sprv");
238 vsmPackDraw0 = computeShader("vsm_pack_draws0.comp.sprv");
239 vsmPackDraw1 = computeShader("vsm_pack_draws1.comp.sprv");
240 vsmFogPages = computeShader("vsm_fog_mark_pages.comp.sprv");
241 vsmFogShadow = computeShader("vsm_fog_shadow.comp.sprv");
242 vsmFogTrace = computeShader("vsm_fog_trace.comp.sprv");
243 vsmFog = fogShader("fog_epipolar");
244
245 vsmDirectLight = postEffect("direct_light_vsm", RenderState::ZTestMode::NoEqual);
246 vsmDbg = postEffect("vsm_dbg", RenderState::ZTestMode::Always);
247 vsmRendering = computeShader("vsm_rendering.comp.sprv");
248 }
249
251 rtsmDirectLight = postEffect("rtsm_direct_light", RenderState::ZTestMode::NoEqual);
252
253 rtsmClear = computeShader("rtsm_clear.comp.sprv");
254 rtsmPages = computeShader("rtsm_mark_pages.comp.sprv");
255 rtsmFogPages = computeShader("rtsm_mark_fog_pages.comp.sprv");
256 rtsmHiZ = computeShader("rtsm_hiz_pages.comp.sprv");
257
258 rtsmCulling = computeShader("rtsm_culling.comp.sprv");
259 rtsmPosition = computeShader("rtsm_position.comp.sprv");
260 rtsmMeshletCull = computeShader("rtsm_meshlet_cull.comp.sprv");
261 rtsmPrimCull = computeShader("rtsm_primitive_cull.comp.sprv");
262 rtsmRaster = computeShader("rtsm_raster.comp.sprv");
263
264 rtsmClearOmni = computeShader("rtsm_omni_clear.comp.sprv");
265 rtsmCullLights = computeShader("rtsm_cull_lights.comp.sprv");
266 rtsmCompactLights = computeShader("rtsm_compact_lights.comp.sprv");
267 rtsmLightsOmni = computeShader("rtsm_omni_lights.comp.sprv");
268 rtsmBboxesOmni = computeShader("rtsm_omni_bboxes.comp.sprv");
269 rtsmCullingOmni = computeShader("rtsm_omni_culling.comp.sprv");
270 rtsmPositionOmni = computeShader("rtsm_omni_position.comp.sprv");
271
272 rtsmMeshletOmni = computeShader("rtsm_omni_meshlet.comp.sprv");
273 rtsmBackfaceOmni = computeShader("rtsm_omni_backface.comp.sprv");
274 rtsmCompactOmni = computeShader("rtsm_omni_compact.comp.sprv");
275 rtsmTaskOmni = computeShader("rtsm_omni_task.comp.sprv");
276 rtsmPrimOmni = computeShader("rtsm_omni_primitive.comp.sprv");
277 rtsmRasterOmni = computeShader("rtsm_omni_raster.comp.sprv");
278
279 rtsmRendering = computeShader("rtsm_rendering.comp.sprv");
280 rtsmRenderingOmni= computeShader("rtsm_omni_rendering.comp.sprv");
281 rtsmDbg = postEffect("rtsm_dbg", RenderState::ZTestMode::Always);
282 }
283
284 swRaytracing = computeShader("sw_raytracing.comp.sprv");
285 swRaytracing8 = computeShader("sw_raytracing8.comp.sprv");
286 swRaytracing64 = computeShader("sw_raytracing64.comp.sprv");
287
288 if(Gothic::options().swRenderingPreset>0) {
289 switch(Gothic::options().swRenderingPreset) {
290 case 1:
291 swRendering = computeShader("sw_rendering_imm.comp.sprv");
292 break;
293 case 2:
294 swRendering = computeShader("sw_rendering_tbr.comp.sprv");
295 break;
296 case 3:
297 swRendering = computeShader("sw_light.comp.sprv");
298 break;
299 }
300 swRenderingDbg = postEffect("vbuffer_blit", RenderState::ZTestMode::Always);
301 }
302
303 {
304 RenderState state;
305 state.setCullFaceMode(RenderState::CullMode::Front);
306 state.setZTestMode (RenderState::ZTestMode::LEqual);
307
308 auto sh = GothicShader::get("item.vert.sprv");
309 auto vs = device.shader(sh.data,sh.len);
310 sh = GothicShader::get("item.frag.sprv");
311 auto fs = device.shader(sh.data,sh.len);
312 inventory = device.pipeline(Triangles,state,vs,fs);
313 }
314 }
315
317 auto& gpu = Resources::device().properties();
318 if(gpu.compute.maxInvocations>=1024 && gpu.render.maxClipCullDistances>=4 &&
319 gpu.render.maxViewportSize.w>=8192 && gpu.render.maxViewportSize.h>=8192) {
320 return true;
321 }
322 return false;
323 }
324
326 if(!Gothic::options().doBindless) {
327 return false;
328 }
329 auto& gpu = Resources::device().properties();
330 if(!gpu.hasStorageFormat(TextureFormat::RG32U) || !gpu.hasStorageFormat(TextureFormat::R11G11B10UF))
331 return false;
332 if(gpu.compute.maxInvocations<512 || gpu.compute.maxSharedMemory<32*1024 || !gpu.descriptors.nonUniformIndexing) {
333 return false;
334 }
335 return true;
336 }
337
338const RenderPipeline* Shaders::materialPipeline(const Material& mat, DrawCommands::Type t, PipelineType pt, bool bl) const {
339 if(t==DrawCommands::Static) {
340 // same shader
342 }
343
344 if(pt!=PipelineType::T_Main && !mat.isSolid()) {
345 return nullptr;
346 }
348 return nullptr;
349 }
350
351 const auto alpha = (mat.isGhost ? Material::Ghost : mat.alpha);
352 const bool trivial = (!mat.hasUvAnimation() && alpha==Material::Solid && t==DrawCommands::Landscape);
353
354 for(auto& i:materials) {
355 if(i.alpha==alpha && i.type==t && i.pipelineType==pt && i.bindless==bl && i.trivial==trivial)
356 return &i.pipeline;
357 }
358
359 RenderState state;
360 state.setCullFaceMode(RenderState::CullMode::Front);
361 state.setZTestMode (RenderState::ZTestMode::LEqual);
362 //state.setZTestMode (RenderState::ZTestMode::Less);
363
365 state.setZTestMode(RenderState::ZTestMode::Greater); //FIXME
366 }
367 if(pt==PipelineType::T_Vsm) {
368 // state.setZTestMode(RenderState::ZTestMode::Always); //FIXME
369 state.setZTestMode(RenderState::ZTestMode::Greater); //FIXME
370 }
371
372 switch(alpha) {
373 case Material::Solid:
375 case Material::Water:
376 case Material::Ghost:
377 break;
379 state.setBlendSource (RenderState::BlendMode::SrcAlpha); // premultiply in shader
380 state.setBlendDest (RenderState::BlendMode::OneMinusSrcAlpha);
381 state.setZWriteEnabled(false);
382 break;
384 state.setBlendSource (RenderState::BlendMode::SrcAlpha);
385 state.setBlendDest (RenderState::BlendMode::One);
386 state.setZWriteEnabled(false);
387 break;
390 state.setBlendSource (RenderState::BlendMode::DstColor);
391 state.setBlendDest (RenderState::BlendMode::SrcColor);
392 state.setZWriteEnabled(false);
393 break;
394 }
395
396 static bool overdrawDbg = false;
397 if(overdrawDbg &&
399 state.setBlendSource(RenderState::BlendMode::One);
400 state.setBlendDest (RenderState::BlendMode::One);
401 state.setZWriteEnabled(false);
402 state.setZTestMode(RenderState::ZTestMode::Always);
403 }
404
405 const char* vsTok = "";
406 const char* fsTok = "";
407
408 switch(t) {
410 vsTok = "lnd";
411 fsTok = "lnd";
412 break;
415 vsTok = "obj";
416 fsTok = "obj";
417 break;
419 vsTok = "ani";
420 fsTok = "obj";
421 break;
423 vsTok = "pfx";
424 fsTok = "pfx";
425 break;
427 vsTok = "mph";
428 fsTok = "obj";
429 break;
430 }
431
432 const char* typeVsM = nullptr;
433 const char* typeVsD = nullptr;
434 const char* typeVsV = nullptr;
435 const char* typeFsM = nullptr;
436 const char* typeFsD = nullptr;
437 const char* typeFsV = nullptr;
438
439 switch(alpha) {
440 case Material::Solid:
441 typeVsM = "";
442 typeFsM = "_g";
443 typeVsD = "_d";
444 typeFsD = "_d";
445 typeVsV = "_v";
446 typeFsV = "_v";
447 if(trivial)
448 typeFsM = "_g_s";
449 break;
451 typeVsM = "";
452 typeFsM = "_g_at";
453 typeVsD = "_d_at";
454 typeFsD = "_d_at";
455 typeVsV = "_v_at";
456 typeFsV = "_v_at";
457 break;
459 typeVsM = "_f";
460 typeFsM = "_f";
461 break;
464 typeVsM = "";
465 typeFsM = "_e";
466 break;
468 typeVsM = "";
469 typeFsM = "_e";
470 break;
471 case Material::Water:
472 typeVsM = "_f";
473 typeFsM = "_w";
474 break;
475 case Material::Ghost:
476 typeVsM = "";
477 typeFsM = "_x";
478 break;
479 }
480
481 const char* typeVs = "";
482 const char* typeFs = "";
483 switch(pt) {
484 case T_Shadow:
485 case T_Depth:
486 typeVs = typeVsD;
487 typeFs = typeFsD;
488 break;
489 case T_Vsm:
490 typeVs = typeVsV;
491 typeFs = typeFsV;
492 break;
493 case T_Main:
494 typeVs = typeVsM;
495 typeFs = typeFsM;
496 break;
497 }
498
499 if(typeVs==nullptr || typeFs==nullptr)
500 return nullptr;
501
502 const char* bindless = bl ? "_bindless" : "_slot";
503
504 materials.emplace_front();
505 auto& b = materials.front();
506 b.alpha = alpha;
507 b.type = t;
508 b.pipelineType = pt;
509 b.bindless = bl;
510 b.trivial = trivial;
511
512 auto& device = Resources::device();
513 if(mat.isTesselated() && device.properties().tesselationShader && t==DrawCommands::Landscape && true) {
514 auto shVs = GothicShader::get(string_frm("main_", vsTok, typeVs, bindless, ".vert.sprv"));
515 auto shTc = GothicShader::get(string_frm("main_", vsTok, typeVs, bindless, ".tesc.sprv"));
516 auto shTe = GothicShader::get(string_frm("main_", vsTok, typeVs, bindless, ".tese.sprv"));
517 auto shFs = GothicShader::get(string_frm("main_", fsTok, typeFs, bindless, ".frag.sprv"));
518
519 auto vs = device.shader(shVs.data,shVs.len);
520 auto tc = device.shader(shTc.data,shTc.len);
521 auto te = device.shader(shTe.data,shTe.len);
522 auto fs = device.shader(shFs.data,shFs.len);
523 b.pipeline = device.pipeline(Triangles, state, vs, tc, te, fs);
524 }
525 else if(Gothic::options().doMeshShading && t!=DrawCommands::Pfx) {
526 auto shMs = GothicShader::get(string_frm("main_", vsTok, typeVs, bindless, ".mesh.sprv"));
527 auto shFs = GothicShader::get(string_frm("main_", fsTok, typeFs, bindless, ".frag.sprv"));
528
529 auto ms = device.shader(shMs.data,shMs.len);
530 auto fs = device.shader(shFs.data,shFs.len);
531 b.pipeline = device.pipeline(state, Shader(), ms, fs);
532 }
533 else if(t!=DrawCommands::Pfx) {
534 auto shVs = GothicShader::get(string_frm("main_", vsTok, typeVs, bindless, ".vert.sprv"));
535 auto shFs = GothicShader::get(string_frm("main_", fsTok, typeFs, bindless, ".frag.sprv"));
536
537 auto vs = device.shader(shVs.data,shVs.len);
538 auto fs = device.shader(shFs.data,shFs.len);
539 b.pipeline = device.pipeline(Triangles, state, vs, fs);
540 }
541 else {
542 auto shVs = GothicShader::get(string_frm("main_", vsTok, typeVs, ".vert.sprv"));
543 auto shFs = GothicShader::get(string_frm("main_", fsTok, typeFs, ".frag.sprv"));
544
545 auto vs = device.shader(shVs.data,shVs.len);
546 auto fs = device.shader(shFs.data,shFs.len);
547 b.pipeline = device.pipeline(Triangles, state, vs, fs);
548 }
549
550 return &b.pipeline;
551 }
552
553RenderPipeline Shaders::postEffect(std::string_view name) {
554 return postEffect("triangle",name);
555 }
556
557RenderPipeline Shaders::postEffect(std::string_view name, Tempest::RenderState::ZTestMode ztest) {
558 return postEffect("triangle",name,ztest);
559 }
560
561RenderPipeline Shaders::postEffect(std::string_view vsName, std::string_view fsName, Tempest::RenderState::ZTestMode ztest) {
562 auto& device = Resources::device();
563
564 RenderState stateFsq;
565 stateFsq.setZTestMode (ztest);
566 stateFsq.setZWriteEnabled(false);
567
568 auto sh = GothicShader::get(string_frm(vsName,".vert.sprv"));
569 auto vs = device.shader(sh.data,sh.len);
570
571 sh = GothicShader::get(string_frm(fsName,".frag.sprv"));
572 auto fs = device.shader(sh.data,sh.len);
573 return device.pipeline(Triangles,stateFsq,vs,fs);
574 }
575
576ComputePipeline Shaders::computeShader(std::string_view name) {
577 auto& device = Resources::device();
578 auto sh = GothicShader::get(name);
579 return device.pipeline(device.shader(sh.data,sh.len));
580 }
581
582RenderPipeline Shaders::fogShader(std::string_view name) {
583 auto& device = Resources::device();
584 const bool fogDbg = false;
585
586 RenderState state;
587 state.setZWriteEnabled(false);
588 state.setBlendSource (RenderState::BlendMode::One);
589 if(!fogDbg) {
590 state.setBlendDest(RenderState::BlendMode::OneMinusSrcAlpha);
591 }
592
593 auto sh = GothicShader::get("triangle.vert.sprv");
594 auto vs = device.shader(sh.data,sh.len);
595
596 sh = GothicShader::get(string_frm(name,".frag.sprv"));
597 auto fs = device.shader(sh.data,sh.len);
598 return device.pipeline(Triangles,state,vs,fs);
599 }
600
601RenderPipeline Shaders::inWaterShader(std::string_view name, bool isScattering) {
602 auto& device = Resources::device();
603
604 RenderState state;
605 state.setZWriteEnabled(false);
606
607 if(isScattering) {
608 state.setBlendSource(RenderState::BlendMode::One);
609 state.setBlendDest (RenderState::BlendMode::One);
610 } else {
611 state.setBlendSource(RenderState::BlendMode::Zero);
612 state.setBlendDest (RenderState::BlendMode::SrcColor);
613 }
614
615 auto sh = GothicShader::get("triangle.vert.sprv");
616 auto vs = device.shader(sh.data,sh.len);
617
618 sh = GothicShader::get(string_frm(name,".frag.sprv"));
619 auto fs = device.shader(sh.data,sh.len);
620 return device.pipeline(Triangles,state,vs,fs);
621 }
622
623RenderPipeline Shaders::reflectionShader(std::string_view name, bool hasMeshlets) {
624 auto& device = Resources::device();
625
626 RenderState state;
627 state.setZTestMode (RenderState::ZTestMode::LEqual);
628 state.setZWriteEnabled(false);
629 state.setBlendSource (RenderState::BlendMode::One);
630 state.setBlendDest (RenderState::BlendMode::One);
631
632 auto sh = GothicShader::get("triangle.vert.sprv");
633 auto vs = device.shader(sh.data,sh.len);
634 sh = GothicShader::get(name);
635 auto fs = device.shader(sh.data,sh.len);
636
637 if(hasMeshlets) {
638 sh = GothicShader::get("water_reflection.mesh.sprv");
639 vs = device.shader(sh.data,sh.len);
640 }
641
642 return device.pipeline(Triangles, state, vs, fs);
643 }
644
645RenderPipeline Shaders::ambientLightShader(std::string_view name) {
646 auto& device = Resources::device();
647
648 RenderState state;
649 state.setBlendSource (RenderState::BlendMode::One);
650 state.setBlendDest (RenderState::BlendMode::SrcAlpha); // debug
651 state.setZTestMode (RenderState::ZTestMode::NoEqual);
652 state.setZWriteEnabled(false);
653
654 auto sh = GothicShader::get("triangle.vert.sprv");
655 auto vs = device.shader(sh.data,sh.len);
656 sh = GothicShader::get(string_frm(name,".frag.sprv"));
657 auto fs = device.shader(sh.data,sh.len);
658
659 return device.pipeline(Triangles, state, vs, fs);
660 }
static auto options() -> const Options &
Definition gothic.cpp:496
bool isGhost
Definition material.h:34
bool isTesselated() const
Definition material.h:44
@ AdditiveLight
Definition material.h:25
@ Multiply2
Definition material.h:23
@ Multiply
Definition material.h:22
@ Transparent
Definition material.h:24
@ AlphaTest
Definition material.h:19
AlphaFunc alpha
Definition material.h:30
bool hasUvAnimation() const
Definition material.h:43
bool isSolid() const
Definition material.cpp:77
static Tempest::Device & device()
Definition resources.h:83
Tempest::ComputePipeline rtsmPrimOmni
Definition shaders.h:111
Tempest::ComputePipeline rtsmHiZ
Definition shaders.h:101
Tempest::ComputePipeline fogViewLut3d
Definition shaders.h:53
Tempest::RenderPipeline fog3dHQ
Definition shaders.h:50
Tempest::ComputePipeline rtsmMeshletCull
Definition shaders.h:103
static Shaders & inst()
Definition shaders.cpp:39
Tempest::ComputePipeline clusterPatch
Definition shaders.h:72
Tempest::ComputePipeline vsmListPages
Definition shaders.h:89
Tempest::RenderPipeline skyPathTrace
Definition shaders.h:56
Tempest::ComputePipeline probeAlocation
Definition shaders.h:78
Tempest::ComputePipeline vsmRendering
Definition shaders.h:96
Tempest::ComputePipeline rtsmLightsOmni
Definition shaders.h:110
Tempest::ComputePipeline rtsmMeshletOmni
Definition shaders.h:109
Tempest::ComputePipeline vsmCullLights
Definition shaders.h:88
~Shaders()
Definition shaders.cpp:30
Tempest::ComputePipeline fogViewLutSep
Definition shaders.h:53
Tempest::ComputePipeline rtsmBackfaceOmni
Definition shaders.h:109
Tempest::RenderPipeline tonemappingUpscale
Definition shaders.h:61
Tempest::ComputePipeline probeInit
Definition shaders.h:77
Tempest::RenderPipeline directLightSh
Definition shaders.h:32
Tempest::ComputePipeline swRaytracing64
Definition shaders.h:116
Tempest::ComputePipeline fogOcclusion
Definition shaders.h:52
Tempest::ComputePipeline swRendering
Definition shaders.h:120
Tempest::RenderPipeline stash
Definition shaders.h:39
Tempest::RenderPipeline probeHitDbg
Definition shaders.h:76
Tempest::RenderPipeline waterReflection
Definition shaders.h:59
Tempest::ComputePipeline hiZMip
Definition shaders.h:69
Tempest::RenderPipeline rtsmDbg
Definition shaders.h:114
Tempest::ComputePipeline probePrune
Definition shaders.h:78
Tempest::ComputePipeline vsmPackDraw1
Definition shaders.h:90
static bool isRtsmSupported()
Definition shaders.cpp:325
Tempest::RenderPipeline probeAmbient
Definition shaders.h:80
Tempest::ComputePipeline rtsmCulling
Definition shaders.h:102
Tempest::ComputePipeline rtsmCompactOmni
Definition shaders.h:110
Tempest::RenderPipeline vsmDirectLight
Definition shaders.h:93
Tempest::RenderPipeline skyViewLut
Definition shaders.h:48
Tempest::ComputePipeline vsmPostprocessOmni
Definition shaders.h:88
Tempest::RenderPipeline directLightRq
Definition shaders.h:32
const Tempest::RenderPipeline * materialPipeline(const Material &desc, DrawCommands::Type t, PipelineType pt, bool bindless) const
Definition shaders.cpp:338
Tempest::ComputePipeline vsmSortPages
Definition shaders.h:89
Tempest::RenderPipeline ambientLight
Definition shaders.h:33
Tempest::ComputePipeline rtsmRaster
Definition shaders.h:104
Tempest::RenderPipeline vsmDbg
Definition shaders.h:94
Tempest::ComputePipeline visibilityPassSh
Definition shaders.h:73
PipelineType
Definition shaders.h:20
@ T_Main
Definition shaders.h:24
@ T_Shadow
Definition shaders.h:22
@ T_Vsm
Definition shaders.h:23
@ T_Depth
Definition shaders.h:21
Tempest::RenderPipeline sun
Definition shaders.h:51
Tempest::RenderPipeline lightsVsm
Definition shaders.h:31
Tempest::ComputePipeline visibilityPassHiZCr
Definition shaders.h:73
Tempest::RenderPipeline inventory
Definition shaders.h:124
Tempest::ComputePipeline rtsmPosition
Definition shaders.h:102
Tempest::ComputePipeline rtsmRendering
Definition shaders.h:113
Tempest::ComputePipeline vsmMarkOmniPages
Definition shaders.h:88
Tempest::ComputePipeline swRaytracing
Definition shaders.h:116
Tempest::RenderPipeline skyTransmittance
Definition shaders.h:47
Tempest::ComputePipeline hiZPot
Definition shaders.h:69
Tempest::ComputePipeline probeMakeHash
Definition shaders.h:77
Tempest::RenderPipeline swRenderingDbg
Definition shaders.h:121
Tempest::ComputePipeline ssao
Definition shaders.h:42
Tempest::ComputePipeline rtsmCullLights
Definition shaders.h:107
Tempest::ComputePipeline rtsmRasterOmni
Definition shaders.h:111
Tempest::RenderPipeline lightsRq
Definition shaders.h:31
Tempest::ComputePipeline ssaoBlur
Definition shaders.h:42
Tempest::ComputePipeline rtsmTaskOmni
Definition shaders.h:110
Tempest::ComputePipeline vsmFogShadow
Definition shaders.h:91
Tempest::ComputePipeline probeClear
Definition shaders.h:77
Tempest::ComputePipeline visibilityPassHiZ
Definition shaders.h:73
Tempest::ComputePipeline vsmVisibilityPass
Definition shaders.h:87
Tempest::ComputePipeline vsmPackDraw0
Definition shaders.h:90
Tempest::RenderPipeline vsmFog
Definition shaders.h:92
Tempest::ComputePipeline rtsmRenderingOmni
Definition shaders.h:113
Tempest::ComputePipeline vsmAllocPages
Definition shaders.h:89
static bool isVsmSupported()
Definition shaders.cpp:316
Tempest::ComputePipeline rtsmCompactLights
Definition shaders.h:107
Tempest::ComputePipeline rtsmPrimCull
Definition shaders.h:103
Tempest::RenderPipeline skyViewCldLut
Definition shaders.h:48
Tempest::ComputePipeline cmaa2ProcessCandidates
Definition shaders.h:65
Tempest::RenderPipeline directLight
Definition shaders.h:32
Tempest::RenderPipeline fog
Definition shaders.h:49
void waitCompiler()
Definition shaders.cpp:35
Tempest::ComputePipeline probeVote
Definition shaders.h:78
Tempest::ComputePipeline vsmClear
Definition shaders.h:88
Tempest::ComputePipeline rtsmClearOmni
Definition shaders.h:106
Tempest::ComputePipeline vsmFogPages
Definition shaders.h:91
Tempest::ComputePipeline vsmMergePages
Definition shaders.h:89
Tempest::RenderPipeline ambientLightSsao
Definition shaders.h:33
Tempest::ComputePipeline vsmTrimPages
Definition shaders.h:89
Tempest::ComputePipeline fogEpipolarVsm
Definition shaders.h:83
Tempest::RenderPipeline underwaterT
Definition shaders.h:58
Tempest::RenderPipeline copy
Definition shaders.h:38
Tempest::RenderPipeline sky
Definition shaders.h:48
Tempest::RenderPipeline cmaa2DeferredColorApply2x2
Definition shaders.h:66
Tempest::ComputePipeline cloudsLut
Definition shaders.h:52
Tempest::ComputePipeline rtsmCullingOmni
Definition shaders.h:107
Tempest::ComputePipeline probeTrace
Definition shaders.h:79
Tempest::RenderPipeline skyMultiScattering
Definition shaders.h:47
Tempest::ComputePipeline rtsmPositionOmni
Definition shaders.h:108
Tempest::RenderPipeline lights
Definition shaders.h:31
Tempest::ComputePipeline clusterInit
Definition shaders.h:72
Tempest::ComputePipeline rtsmBboxesOmni
Definition shaders.h:110
Tempest::ComputePipeline cmaa2EdgeColor2x2Presets[uint32_t(AaPreset::PRESETS_COUNT)]
Definition shaders.h:64
Tempest::ComputePipeline vsmFogTrace
Definition shaders.h:91
Tempest::RenderPipeline skySep
Definition shaders.h:48
Tempest::ComputePipeline patch
Definition shaders.h:37
Tempest::ComputePipeline fogEpipolarOcclusion
Definition shaders.h:84
Tempest::RenderPipeline bink
Definition shaders.h:40
Shaders()
Definition shaders.cpp:17
Tempest::ComputePipeline irradiance
Definition shaders.h:44
Tempest::ComputePipeline copyImg
Definition shaders.h:36
Tempest::RenderPipeline rtsmDirectLight
Definition shaders.h:99
Tempest::ComputePipeline swRaytracing8
Definition shaders.h:117
Tempest::ComputePipeline vsmClearOmni
Definition shaders.h:88
Tempest::ComputePipeline rtsmFogPages
Definition shaders.h:101
Tempest::ComputePipeline copyBuf
Definition shaders.h:35
Tempest::ComputePipeline probeLighting
Definition shaders.h:79
Tempest::RenderPipeline waterReflectionSSR
Definition shaders.h:59
Tempest::ComputePipeline rtsmPages
Definition shaders.h:101
Tempest::RenderPipeline underwaterS
Definition shaders.h:58
Tempest::ComputePipeline vsmMarkPages
Definition shaders.h:88
Tempest::ComputePipeline vsmClumpPages
Definition shaders.h:89
Tempest::RenderPipeline probeDbg
Definition shaders.h:76
Tempest::ComputePipeline rtsmClear
Definition shaders.h:101
Tempest::ComputePipeline probeClearHash
Definition shaders.h:77
Tempest::ComputePipeline skyExposure
Definition shaders.h:54
Tempest::RenderPipeline tonemapping
Definition shaders.h:61
Tempest::ComputePipeline vsmAlloc2Pages
Definition shaders.h:89
static void setThreadName(const char *threadName)
Definition workers.cpp:66