47 enum class AAMode : quint8
55 enum class TAAMode : quint8
62 enum class AAQuality : quint8
69 enum class HorizontalField : quint8
76 enum class VerticalField : quint8
83 enum class UnitType : quint8
89 enum class Background : quint8
99 enum class TonemapMode : quint8
108 static size_t
constexpr TonemapModeCount = 6;
112 EnableDepthTest = 0x1,
113 EnableDepthPrePass = 0x2,
116 Q_DECLARE_FLAGS(LayerFlags, LayerFlag)
118 enum class MaterialDebugMode : quint8
135 enum class OITMethod : quint8
142 enum class RenderOverrides : quint8
145 DisableInternalPasses = 0x1,
147 using RenderOverridesT = std::underlying_type_t<RenderOverrides>;
149 enum class DirtyFlag : quint8
153 using FlagT = std::underlying_type_t<DirtyFlag>;
155 static constexpr DirtyFlag DirtyMask { std::numeric_limits<FlagT>::max() };
157 [[nodiscard]]
bool isDirty(DirtyFlag dirtyFlag = DirtyMask)
const
159 return ((m_layerDirtyFlags & FlagT(dirtyFlag)) != 0)
160 || ((dirtyFlag == DirtyMask) && QSSGRenderNode::isDirty());
162 void markDirty(DirtyFlag dirtyFlag);
163 void clearDirty(DirtyFlag dirtyFlag);
165 void ref(QSSGRenderRoot *inRootNode)
167 rootNode = inRootNode;
168 rootNodeRef = &rootNode;
171 QSSGRenderRoot *rootNode =
nullptr;
173 QSSGRenderLayerHandle lh;
176 QSSGRenderEffect *firstEffect;
177 QSSGLayerRenderData *renderData =
nullptr;
178 enum class RenderExtensionStage { TextureProviders, Underlay, Overlay, Count };
179 QList<QSSGRenderExtension *> renderExtensions[size_t(RenderExtensionStage::Count)];
181 QSSGRenderLayer::AAMode antialiasingMode;
182 QSSGRenderLayer::AAQuality antialiasingQuality;
183 QVector4D currentAndLastJitter;
185 QSSGRenderLayer::Background background;
186 QVector3D clearColor;
188 FlagT m_layerDirtyFlags = FlagT(DirtyFlag::TreeDirty);
189 quint8 viewCount = 1;
192 float aoStrength = 0.0f;
193 float aoDistance = 5.0f;
194 float aoSoftness = 50.0f;
196 qint32 aoSamplerate = 2;
197 bool aoDither =
false;
198 bool aoEnabled =
false;
200 constexpr bool ssaoEnabled()
const {
return aoEnabled && (aoStrength > 0.0f && aoDistance > 0.0f); }
203 QSSGRenderImage *lightProbe {
nullptr };
204 struct LightProbeSettings {
205 float probeExposure { 1.0f };
206 float probeHorizon { -1.0f };
207 QMatrix3x3 probeOrientation;
208 QVector3D probeOrientationAngles;
209 } lightProbeSettings;
211 QSSGRenderSkyMaterial *skyMaterial =
nullptr;
213 QSSGRenderImage *skyBoxCubeMap =
nullptr;
215 TAAMode temporalAAMode { TAAMode::Off };
216 float temporalAAStrength;
217 float ssaaMultiplier;
218 bool specularAAEnabled;
224 bool temporalAAIsActive;
225 bool progressiveAAIsActive;
226 uint tempAAPassIndex;
227 uint progAAPassIndex;
229 RenderOverridesT renderOverrides { RenderOverridesT(RenderOverrides::None) };
232 QVarLengthArray<QSSGRenderCamera *, 2> explicitCameras;
234 QVarLengthArray<QSSGRenderCamera *, 2> renderedCameras;
235 QMutex renderedCamerasMutex;
238 TonemapMode tonemapMode;
240 LayerFlags layerFlags { LayerFlag::RenderToTarget,
241 LayerFlag::EnableDepthTest,
242 LayerFlag::EnableDepthPrePass };
245 QRhiShaderResourceBindings *skyBoxSrb =
nullptr;
246 QVarLengthArray<QRhiShaderResourceBindings *, 4> item2DSrbs;
247 bool skyBoxIsRgbe8 =
false;
248 bool skyBoxIsSrgb =
false;
251 float skyboxBlurAmount = 0.0f;
254 bool gridEnabled =
false;
255 float gridScale = 1.0f;
256 quint32 gridFlags = 0;
257 QRhiShaderResourceBindings *gridSrb =
nullptr;
264 bool enabled =
false;
265 QVector3D color = QVector3D(0.5f, 0.6f, 0.7f);
266 float density = 1.0f;
267 bool depthEnabled =
false;
268 float depthBegin = 10.0f;
269 float depthEnd = 1000.0f;
270 float depthCurve = 1.0f;
271 bool heightEnabled =
false;
272 float heightMin = 10.0f;
273 float heightMax = 0.0f;
274 float heightCurve = 1.0f;
275 bool transmitEnabled =
false;
276 float transmitCurve = 1.0f;
279 QVector<QSSGRenderGraphObject *> resourceLoaders;
281 MaterialDebugMode debugMode = MaterialDebugMode::None;
283 bool wireframeMode =
false;
284 bool drawDirectionalLightShadowBoxes =
false;
285 bool drawPointLightShadowBoxes =
false;
286 bool drawShadowCastingBounds =
false;
287 bool drawShadowReceivingBounds =
false;
288 bool drawCascades =
false;
289 bool drawSceneCascadeIntersection =
false;
290 bool disableShadowCameraUpdate =
false;
291 bool drawCulledObjects =
false;
295 QString lightmapSource;
300 void setProbeOrientation(
const QVector3D &angles);
302 void addEffect(QSSGRenderEffect &inEffect);
303 bool hasEffect(QSSGRenderEffect *inEffect)
const;
305 QSSGRenderNode *importSceneNode =
nullptr;
308 void setImportScene(QSSGRenderNode &rootNode);
309 void removeImportScene(QSSGRenderNode &rootNode);
311 [[nodiscard]]
bool isMsaaEnabled()
const {
return antialiasingMode == AAMode::MSAA; }
312 [[nodiscard]]
bool isSsaaEnabled()
const {
return antialiasingMode == AAMode::SSAA; }
314 [[nodiscard]]
bool isProgressiveAAEnabled()
const {
return antialiasingMode == AAMode::ProgressiveAA && temporalAAMode != TAAMode::MotionVector; }
316 [[nodiscard]]
bool isTemporalAAEnabled()
const {
return (temporalAAMode != TAAMode::Off) && !isMsaaEnabled(); }
318 static constexpr float ssaaMultiplierForQuality(QSSGRenderLayer::AAQuality quality)
321 case QSSGRenderLayer::AAQuality::Normal:
323 case QSSGRenderLayer::AAQuality::High:
325 case QSSGRenderLayer::AAQuality::VeryHigh: