238 MAX_TEMPORAL_AA_LEVELS = 2,
241 using InstanceTransforms = QSSGGlobalRenderNodeData::InstanceTransforms;
242 using ModelViewProjections = QSSGRenderModelData::ModelViewProjections;
244 using QSSGModelsView = QSSGDataView<QSSGRenderModel *>;
245 using QSSGParticlesView = QSSGDataView<QSSGRenderParticles *>;
246 using QSSGItem2DsView = QSSGDataView<QSSGRenderItem2D *>;
247 using QSSGCamerasView = QSSGDataView<QSSGRenderCamera *>;
248 using QSSGLightsView = QSSGDataView<QSSGRenderLight *>;
249 using QSSGReflectionProbesView = QSSGDataView<QSSGRenderReflectionProbe *>;
250 using QSSGNonCategorizedView = QSSGDataView<QSSGRenderNode *>;
252 using RenderableFilter = std::function<
bool(QSSGModelContext *)>;
254 QSSGLayerRenderData(QSSGRenderLayer &inLayer, QSSGRenderer &inRenderer);
255 ~QSSGLayerRenderData();
257 typedef QVector<QSSGModelContext *> TModelContextPtrList;
258 using RenderableNodeEntries = QVector<QSSGRenderableNodeEntry>;
259 using RenderableItem2DEntries = QVector<QSSGRenderItem2D *>;
261 void prepareImageForRender(QSSGRenderImage &inImage,
262 QSSGRenderableImage::Type inMapType,
263 QSSGRenderableImage *&ioFirstImage,
264 QSSGRenderableImage *&ioNextImage,
265 QSSGRenderableObjectFlags &ioFlags,
266 QSSGShaderDefaultMaterialKey &ioGeneratedShaderKey,
267 quint32 inImageIndex, QSSGRenderDefaultMaterial *inMaterial =
nullptr);
269 void setVertexInputPresence(
const QSSGRenderableObjectFlags &renderableFlags,
270 QSSGShaderDefaultMaterialKey &key);
272 static void prepareModelBoneTextures(
const QSSGRenderContextInterface &contextInterface,
273 const RenderableNodeEntries &renderableModels);
277 bool prepareModelsForRender(QSSGRenderContextInterface &ctx,
278 const RenderableNodeEntries &renderableModels,
279 QSSGLayerRenderPreparationResultFlags &ioFlags,
280 const QSSGRenderCameraList &allCameras,
281 const QSSGRenderCameraDataList &allCameraData,
282 TModelContextPtrList &modelContexts,
283 QSSGRenderableObjectList &opaqueObjects,
284 QSSGRenderableObjectList &transparentObjects,
285 QSSGRenderableObjectList &screenTextureObjects,
286 float lodThreshold = 0.0f);
287 bool prepareParticlesForRender(
const RenderableNodeEntries &renderableParticles,
const QSSGRenderCameraData &cameraData, QSSGLayerRenderPreparationResultFlags &ioFlags);
289 void prepareResourceLoaders();
291 void prepareForRender();
293 void prepareReflectionProbesForRender();
295 static qsizetype frustumCulling(
const QSSGClippingFrustum &clipFrustum,
const QSSGRenderableObjectList &renderables, QSSGRenderableObjectList &visibleRenderables);
296 [[nodiscard]]
static qsizetype frustumCullingInline(
const QSSGClippingFrustum &clipFrustum, QSSGRenderableObjectList &renderables);
300 const QSSGRenderableObjectList &getSortedOpaqueRenderableObjects(
const QSSGRenderCamera &camera, size_t index = 0);
302 const QSSGRenderableObjectList &getSortedTransparentRenderableObjects(
const QSSGRenderCamera &camera, size_t index = 0);
303 const QSSGRenderableObjectList &getSortedScreenTextureRenderableObjects(
const QSSGRenderCamera &camera, size_t index = 0);
304 const QVector<QSSGBakedLightingModel> &getSortedBakedLightingModels();
305 const RenderableItem2DEntries &getRenderableItem2Ds();
306 const QSSGRenderableObjectList &getSortedRenderedDepthWriteObjects(
const QSSGRenderCamera &camera, size_t index = 0);
307 const QSSGRenderableObjectList &getSortedrenderedOpaqueDepthPrepassObjects(
const QSSGRenderCamera &camera, size_t index = 0);
309 void resetForFrame();
311 QSSGFrameData &getFrameData();
313 ShadowMapPass shadowMapPass;
314 ReflectionMapPass reflectionMapPass;
315 ZPrePassPass zPrePassPass;
316 SSAOMapPass ssaoMapPass;
317 DepthMapPass depthMapPass;
318 DepthMapPass depthMapPassMS;
319 ScreenMapPass screenMapPass;
320 ScreenReflectionPass reflectionPass;
321 Item2DPass item2DPass;
322 SkyboxPass skyboxPass;
323 SkyboxCubeMapPass skyboxCubeMapPass;
324 static constexpr size_t USERPASSES = 3;
325 UserPass userPasses[USERPASSES];
326 OpaquePass opaquePass;
327 TransparentPass transparentPass;
328 OITRenderPass oitRenderPass;
329 OITCompositePass oitCompositePass;
330 InfiniteGridPass infiniteGridPass;
331 DebugDrawPass debugDrawPass;
332 NormalPass normalPass;
335 QVarLengthArray<QSSGRenderPass *, 16> activePasses;
337 QSSGRenderLayer &layer;
338 QSSGRenderer *renderer =
nullptr;
342 using LayerNodes = std::vector<QSSGRenderNode *>;
343 QSSGGlobalRenderNodeData::LayerNodeView layerNodes;
344 LayerNodes layerNodesCategorized;
347 RenderableNodeEntries renderableModels;
348 RenderableNodeEntries renderableParticles;
351 QSSGModelsView modelsView;
352 QSSGParticlesView particlesView;
353 QSSGItem2DsView item2DsView;
354 QSSGCamerasView camerasView;
355 QSSGLightsView lightsView;
356 QSSGReflectionProbesView reflectionProbesView;
357 QSSGNonCategorizedView nonCategorizedView;
360 QSSGRenderCameraList renderedCameras;
361 QSSGShaderLightList globalLights;
363 QVector<QSSGBakedLightingModel> bakedLightingModels;
366 QVector<QSSGBakedLightingModel> renderedBakedLightingModels;
367 RenderableItem2DEntries renderedItem2Ds;
369 QSSGLayerRenderPreparationResult layerPrepResult;
370 std::optional<QSSGRenderCameraDataList> renderedCameraData;
372 TModelContextPtrList modelContexts;
375 bool tooManyLightsWarningShown =
false;
376 bool tooManyDirectionalLightsWarningShown =
false;
377 bool oitWarningUnsupportedShown =
false;
378 bool oitWarningInvalidBlendModeShown =
false;
379 bool orderIndependentTransparencyEnabled =
false;
381 std::unique_ptr<QSSGLightmapBaker> lightmapBaker =
nullptr;
383 QSSGShaderFeatures getShaderFeatures()
const {
return features; }
384 QSSGRhiGraphicsPipelineState getPipelineState()
const {
return ps; }
386 void initializeLightmapBaking(QSSGLightmapBaker::Context &ctx);
387 void maybeProcessLightmapBaking();
389 [[nodiscard]] QSSGRenderGraphObject *getCamera(QSSGCameraId id)
const;
390 [[nodiscard]] QSSGRenderCamera *activeCamera()
const {
return !renderedCameras.isEmpty() ? renderedCameras[0] :
nullptr; }
392 [[nodiscard]] QSSGRenderCameraData getCameraRenderData(
const QSSGRenderCamera *camera);
393 [[nodiscard]] QSSGRenderCameraData getCameraRenderData(
const QSSGRenderCamera *camera)
const;
395 void setLightmapTexture(
const QSSGModelContext &modelContext, QRhiTexture *lightmapTexture);
396 [[nodiscard]] QRhiTexture *getLightmapTexture(
const QSSGModelContext &modelContext)
const;
398 void setBonemapTexture(
const QSSGModelContext &modelContext, QRhiTexture *bonemapTexture);
399 [[nodiscard]] QRhiTexture *getBonemapTexture(
const QSSGModelContext &modelContext)
const;
401 [[nodiscard]] QSSGRenderContextInterface *contextInterface()
const;
403 [[nodiscard]]
bool isZPrePassActive()
const {
return zPrePassActive; }
404 void setZPrePassPrepResult(
bool res) { zPrePassActive = res; }
407 [[nodiscard]]
const QSSGShaderDefaultMaterialKeyProperties &getDefaultMaterialPropertyTable()
const
409 return defaultMaterialShaderKeyProperties;
412 struct GlobalRenderProperties
414 bool isYUpInFramebuffer =
true;
415 bool isYUpInNDC =
true;
416 bool isClipDepthZeroToOne =
true;
419 [[nodiscard]]
static GlobalRenderProperties globalRenderProperties(
const QSSGRenderContextInterface &ctx);
423 const QSSGRenderShadowMapPtr &requestShadowMapManager();
424 const QSSGRenderReflectionMapPtr &requestReflectionMapManager();
425 const QSSGRenderShadowMapPtr &getShadowMapManager()
const {
return shadowMapManager; }
426 const QSSGRenderReflectionMapPtr &getReflectionMapManager()
const {
return reflectionMapManager; }
428 QSSGOITRenderContext &getOitRenderContext() {
return oitRenderContext; }
430 static bool prepareInstancing(QSSGRhiContext *rhiCtx,
431 QSSGSubsetRenderable *renderable,
432 const QVector3D &cameraDirection,
433 const QVector3D &cameraPosition,
437 [[nodiscard]] QSSGRhiRenderableTexture *getRenderResult(QSSGFrameData::RenderResult id) {
return &renderResults[size_t(id)]; }
438 [[nodiscard]]
const QSSGRhiRenderableTexture *getRenderResult(QSSGFrameData::RenderResult id)
const {
return &renderResults[size_t(id)]; }
439 [[nodiscard]]
static inline const std::unique_ptr<QSSGPerFrameAllocator> &perFrameAllocator(QSSGRenderContextInterface &ctx);
440 [[nodiscard]]
static inline QSSGLayerRenderData *getCurrent(
const QSSGRenderer &renderer) {
return renderer.m_currentLayer; }
441 void saveRenderState(
const QSSGRenderer &renderer);
442 void restoreRenderState(QSSGRenderer &renderer);
444 static void setTonemapFeatures(QSSGShaderFeatures &features, QSSGRenderLayer::TonemapMode tonemapMode)
446 features.set(QSSGShaderFeatures::Feature::LinearTonemapping,
447 tonemapMode == QSSGRenderLayer::TonemapMode::Linear);
448 features.set(QSSGShaderFeatures::Feature::AcesTonemapping,
449 tonemapMode == QSSGRenderLayer::TonemapMode::Aces);
450 features.set(QSSGShaderFeatures::Feature::HejlDawsonTonemapping,
451 tonemapMode == QSSGRenderLayer::TonemapMode::HejlDawson);
452 features.set(QSSGShaderFeatures::Feature::FilmicTonemapping,
453 tonemapMode == QSSGRenderLayer::TonemapMode::Filmic);
454 features.set(QSSGShaderFeatures::Feature::ForceIblExposure,
455 tonemapMode == QSSGRenderLayer::TonemapMode::Custom);
458 QSSGPrepContextId getOrCreateExtensionContext(
const QSSGRenderExtension &ext,
459 QSSGRenderCamera *camera =
nullptr,
463 QSSGRenderablesId createRenderables(QSSGPrepContextId prepId,
const QSSGNodeIdList &nodes, QSSGRenderHelpers::CreateFlags createFlags);
464 void setGlobalTransform(QSSGRenderablesId renderablesId,
const QSSGRenderModel &model,
const QMatrix4x4 &mvp);
465 QMatrix4x4 getGlobalTransform(QSSGPrepContextId prepId,
const QSSGRenderModel &model);
466 void setGlobalOpacity(QSSGRenderablesId renderablesId,
const QSSGRenderModel &model,
float opacity);
467 float getGlobalOpacity(QSSGPrepContextId prepId,
const QSSGRenderModel &model);
468 [[nodiscard]] QMatrix4x4 getModelMvps(QSSGPrepContextId prepId,
const QSSGRenderModel &model)
const;
469 void setModelMaterials(QSSGRenderablesId renderablesId,
const QSSGRenderModel &model,
const QList<QSSGResourceId> &materials);
470 void setModelMaterials(
const QSSGRenderablesId renderablesId,
const QList<QSSGResourceId> &materials);
471 [[nodiscard]] QSSGPrepResultId prepareModelsForRender(QSSGRenderContextInterface &contextInterface,
472 QSSGPrepContextId prepId,
473 QSSGRenderablesId renderablesId,
477 [[nodiscard]] QMatrix4x4 getGlobalTransform(QSSGRenderNodeHandle h, QMatrix4x4 defaultValue)
const;
478 [[nodiscard]] QMatrix4x4 getGlobalTransform(QSSGRenderNodeHandle h)
const;
479 [[nodiscard]] QMatrix4x4 getGlobalTransform(
const QSSGRenderNode &node)
const;
481 [[nodiscard]] QMatrix3x3 getNormalMatrix(QSSGRenderModelHandle h)
const;
482 [[nodiscard]] QMatrix3x3 getNormalMatrix(
const QSSGRenderModel &model)
const;
484 [[nodiscard]] ModelViewProjections getModelMvps(QSSGRenderModelHandle h)
const;
485 [[nodiscard]] ModelViewProjections getModelMvps(
const QSSGRenderModel &model)
const;
487 [[nodiscard]] InstanceTransforms getInstanceTransforms(QSSGRenderNodeHandle h)
const;
488 [[nodiscard]] InstanceTransforms getInstanceTransforms(
const QSSGRenderNode &node)
const;
490 [[nodiscard]]
float getGlobalOpacity(QSSGRenderNodeHandle h,
float defaultValue = 1.0f)
const;
491 [[nodiscard]]
float getGlobalOpacity(
const QSSGRenderNode &node)
const;
494 [[nodiscard]] QSSGRenderItem2DData::Item2DRenderer getItem2DRenderer(
const QSSGRenderItem2D &item)
const
496 return item2DData->getItem2DRenderer(item);
499 [[nodiscard]]
const std::unique_ptr<QRhiRenderPassDescriptor> &getItem2DRenderPassDescriptor()
const
501 return item2DData->getItem2DRenderPassDescriptor();
504 [[nodiscard]] ModelViewProjections getItem2DMvps(QSSGRenderItem2DHandle h)
const
506 return item2DData->getModelViewProjection(h);
509 [[nodiscard]] ModelViewProjections getItem2DMvps(
const QSSGRenderItem2D &item)
const
511 return item2DData->getModelViewProjection(item);
516 void prepareRenderables(QSSGRenderContextInterface &ctx,
517 QSSGPrepResultId prepId,
518 QRhiRenderPassDescriptor *renderPassDescriptor,
519 const QSSGRhiGraphicsPipelineState &ps,
520 QSSGRenderablesFilters filter);
521 void renderRenderables(QSSGRenderContextInterface &ctx,
522 QSSGPrepResultId prepId);
524 static bool calculateGlobalVariables(QSSGRenderNode &node,
525 std::vector<QMatrix4x4> &globalTransforms,
526 std::vector<
float> &globalOpacities);
528 QSSGRenderCameraData getCameraDataImpl(
const QSSGRenderCamera *camera)
const;
530 static QSSGNodeIdList filter(
const QSSGGlobalRenderNodeData::LayerNodeView &layerNodes,
535 friend class QSSGRenderer;
536 friend class QSSGRendererPrivate;
537 friend class QSSGFrameData;
538 friend class QSSGModelHelpers;
539 friend class QSSGRenderHelpers;
541 class ExtensionContext
544 explicit ExtensionContext() =
default;
545 explicit ExtensionContext(
const QSSGRenderExtension &ownerExt, QSSGRenderCamera *cam, size_t idx, quint32 slot)
546 : owner(&ownerExt), camera(cam), ps{}, filter{0}, index(idx), slot(slot)
548 const QSSGRenderExtension *owner =
nullptr;
549 QSSGRenderCamera *camera =
nullptr;
550 QSSGRhiGraphicsPipelineState ps[3] {};
551 QSSGRenderablesFilters filter { 0 };
556 std::vector<ExtensionContext> extContexts { ExtensionContext{ } };
557 std::vector<RenderableNodeEntries> renderableModelStore { RenderableNodeEntries{ } };
558 std::vector<TModelContextPtrList> modelContextStore { TModelContextPtrList{ }};
559 std::vector<QSSGRenderableObjectList> renderableObjectStore { QSSGRenderableObjectList{ }};
560 std::vector<QSSGRenderableObjectList> opaqueObjectStore { QSSGRenderableObjectList{ }};
561 std::vector<QSSGRenderableObjectList> transparentObjectStore { QSSGRenderableObjectList{ }};
562 std::vector<QSSGRenderableObjectList> screenTextureObjectStore { QSSGRenderableObjectList{ }};
564 std::shared_ptr<QSSGGlobalRenderNodeData> nodeData;
565 std::unique_ptr<QSSGRenderModelData> modelData;
566 std::unique_ptr<QSSGRenderItem2DData> item2DData;
569 using PerCameraCache = std::unordered_map<
const QSSGRenderCamera *, QSSGRenderableObjectList>;
570 std::vector<PerCameraCache> sortedOpaqueObjectCache { PerCameraCache{ } };
571 std::vector<PerCameraCache> sortedTransparentObjectCache { PerCameraCache{ } };
572 std::vector<PerCameraCache> sortedScreenTextureObjectCache { PerCameraCache{ } };
573 std::vector<PerCameraCache> sortedOpaqueDepthPrepassCache { PerCameraCache{ } };
574 std::vector<PerCameraCache> sortedDepthWriteCache { PerCameraCache{ } };
576 [[nodiscard]]
const QSSGRenderCameraDataList &getCachedCameraDatas();
577 void ensureCachedCameraDatas();
578 void updateSortedDepthObjectsListImp(
const QSSGRenderCamera &camera, size_t index);
581 QSSGDefaultMaterialPreparationResult prepareDefaultMaterialForRender(QSSGRenderDefaultMaterial &inMaterial,
582 QSSGRenderableObjectFlags &inExistingFlags,
585 bool anyLightHasShadows,
586 QSSGLayerRenderPreparationResultFlags &ioFlags);
588 QSSGDefaultMaterialPreparationResult prepareCustomMaterialForRender(QSSGRenderCustomMaterial &inMaterial,
589 QSSGRenderableObjectFlags &inExistingFlags,
590 float inOpacity,
bool alreadyDirty,
591 bool hasAnyLights,
bool anyLightHasShadows,
592 QSSGLayerRenderPreparationResultFlags &ioFlags);
594 static void prepareModelMaterials(RenderableNodeEntries &renderableModels,
bool cullUnrenderables);
595 static void prepareModelMaterials(
const RenderableNodeEntries::ConstIterator &begin,
596 const RenderableNodeEntries::ConstIterator &end);
599 QHash<QSSGShaderMapKey, QSSGRhiShaderPipelinePtr> shaderMap;
602 QByteArray generatedShaderString;
605 struct SavedRenderState
612 std::optional<SavedRenderState> savedRenderState;
616 QSSGShaderDefaultMaterialKeyProperties defaultMaterialShaderKeyProperties;
617 QSSGFrameData frameData;
618 QSSGRhiGraphicsPipelineState ps;
619 QSSGShaderFeatures features;
621 bool particlesEnabled =
true;
622 bool hasDepthWriteObjects =
false;
623 bool zPrePassActive =
false;
627 bool renderablesModifiedByExtension =
false;
628 enum class DepthPrepassObject : quint8
635 using DepthPrepassObjectStateT = std::underlying_type_t<DepthPrepassObject>;
636 DepthPrepassObjectStateT depthPrepassObjectsState { DepthPrepassObjectStateT(DepthPrepassObject::None) };
637 QSSGRenderShadowMapPtr shadowMapManager;
638 QSSGRenderReflectionMapPtr reflectionMapManager;
639 QHash<
const QSSGModelContext *, QRhiTexture *> lightmapTextures;
640 QHash<
const QSSGModelContext *, QRhiTexture *> bonemapTextures;
641 QSSGRhiRenderableTexture renderResults[7] {};
642 QSSGOITRenderContext oitRenderContext;