46 enum class AAMode : quint8
54 enum class TAAMode : quint8
61 enum class AAQuality : quint8
68 enum class HorizontalField : quint8
75 enum class VerticalField : quint8
82 enum class UnitType : quint8
88 enum class Background : quint8
97 enum class TonemapMode : quint8
106 static size_t
constexpr TonemapModeCount = 6;
110 EnableDepthTest = 0x1,
111 EnableDepthPrePass = 0x2,
114 Q_DECLARE_FLAGS(LayerFlags, LayerFlag)
116 enum class MaterialDebugMode : quint8
133 enum class OITMethod : quint8
140 enum class RenderOverrides : quint8
143 DisableInternalPasses = 0x1,
145 using RenderOverridesT = std::underlying_type_t<RenderOverrides>;
147 enum class DirtyFlag : quint8
151 using FlagT = std::underlying_type_t<DirtyFlag>;
153 static constexpr DirtyFlag DirtyMask { std::numeric_limits<FlagT>::max() };
155 [[nodiscard]]
bool isDirty(DirtyFlag dirtyFlag = DirtyMask)
const
157 return ((m_layerDirtyFlags & FlagT(dirtyFlag)) != 0)
158 || ((dirtyFlag == DirtyMask) && QSSGRenderNode::isDirty());
160 void markDirty(DirtyFlag dirtyFlag);
161 void clearDirty(DirtyFlag dirtyFlag);
163 void ref(QSSGRenderRoot *inRootNode)
165 rootNode = inRootNode;
166 rootNodeRef = &rootNode;
169 QSSGRenderRoot *rootNode =
nullptr;
171 QSSGRenderLayerHandle lh;
174 QSSGRenderEffect *firstEffect;
175 QSSGLayerRenderData *renderData =
nullptr;
176 enum class RenderExtensionStage { TextureProviders, Underlay, Overlay, Count };
177 QList<QSSGRenderExtension *> renderExtensions[size_t(RenderExtensionStage::Count)];
179 QSSGRenderLayer::AAMode antialiasingMode;
180 QSSGRenderLayer::AAQuality antialiasingQuality;
181 QVector4D currentAndLastJitter;
183 QSSGRenderLayer::Background background;
184 QVector3D clearColor;
186 FlagT m_layerDirtyFlags = FlagT(DirtyFlag::TreeDirty);
187 quint8 viewCount = 1;
190 float aoStrength = 0.0f;
191 float aoDistance = 5.0f;
192 float aoSoftness = 50.0f;
194 qint32 aoSamplerate = 2;
195 bool aoDither =
false;
196 bool aoEnabled =
false;
198 constexpr bool ssaoEnabled()
const {
return aoEnabled && (aoStrength > 0.0f && aoDistance > 0.0f); }
201 QSSGRenderImage *lightProbe {
nullptr };
202 struct LightProbeSettings {
203 float probeExposure { 1.0f };
204 float probeHorizon { -1.0f };
205 QMatrix3x3 probeOrientation;
206 QVector3D probeOrientationAngles;
207 } lightProbeSettings;
209 QSSGRenderImage *skyBoxCubeMap =
nullptr;
211 TAAMode temporalAAMode { TAAMode::Off };
212 float temporalAAStrength;
213 float ssaaMultiplier;
214 bool specularAAEnabled;
220 bool temporalAAIsActive;
221 bool progressiveAAIsActive;
222 uint tempAAPassIndex;
223 uint progAAPassIndex;
225 RenderOverridesT renderOverrides { RenderOverridesT(RenderOverrides::None) };
228 QVarLengthArray<QSSGRenderCamera *, 2> explicitCameras;
230 QVarLengthArray<QSSGRenderCamera *, 2> renderedCameras;
231 QMutex renderedCamerasMutex;
234 TonemapMode tonemapMode;
236 LayerFlags layerFlags { LayerFlag::RenderToTarget,
237 LayerFlag::EnableDepthTest,
238 LayerFlag::EnableDepthPrePass };
241 QRhiShaderResourceBindings *skyBoxSrb =
nullptr;
242 QVarLengthArray<QRhiShaderResourceBindings *, 4> item2DSrbs;
243 bool skyBoxIsRgbe8 =
false;
244 bool skyBoxIsSrgb =
false;
247 float skyboxBlurAmount = 0.0f;
250 bool gridEnabled =
false;
251 float gridScale = 1.0f;
252 quint32 gridFlags = 0;
253 QRhiShaderResourceBindings *gridSrb =
nullptr;
260 bool enabled =
false;
261 QVector3D color = QVector3D(0.5f, 0.6f, 0.7f);
262 float density = 1.0f;
263 bool depthEnabled =
false;
264 float depthBegin = 10.0f;
265 float depthEnd = 1000.0f;
266 float depthCurve = 1.0f;
267 bool heightEnabled =
false;
268 float heightMin = 10.0f;
269 float heightMax = 0.0f;
270 float heightCurve = 1.0f;
271 bool transmitEnabled =
false;
272 float transmitCurve = 1.0f;
275 QVector<QSSGRenderGraphObject *> resourceLoaders;
277 MaterialDebugMode debugMode = MaterialDebugMode::None;
279 bool wireframeMode =
false;
280 bool drawDirectionalLightShadowBoxes =
false;
281 bool drawPointLightShadowBoxes =
false;
282 bool drawShadowCastingBounds =
false;
283 bool drawShadowReceivingBounds =
false;
284 bool drawCascades =
false;
285 bool drawSceneCascadeIntersection =
false;
286 bool disableShadowCameraUpdate =
false;
287 bool drawCulledObjects =
false;
291 QString lightmapSource;
296 void setProbeOrientation(
const QVector3D &angles);
298 void addEffect(QSSGRenderEffect &inEffect);
299 bool hasEffect(QSSGRenderEffect *inEffect)
const;
301 QSSGRenderNode *importSceneNode =
nullptr;
304 void setImportScene(QSSGRenderNode &rootNode);
305 void removeImportScene(QSSGRenderNode &rootNode);
307 [[nodiscard]]
bool isMsaaEnabled()
const {
return antialiasingMode == AAMode::MSAA; }
308 [[nodiscard]]
bool isSsaaEnabled()
const {
return antialiasingMode == AAMode::SSAA; }
310 [[nodiscard]]
bool isProgressiveAAEnabled()
const {
return antialiasingMode == AAMode::ProgressiveAA && temporalAAMode != TAAMode::MotionVector; }
312 [[nodiscard]]
bool isTemporalAAEnabled()
const {
return (temporalAAMode != TAAMode::Off) && !isMsaaEnabled(); }
314 static constexpr float ssaaMultiplierForQuality(QSSGRenderLayer::AAQuality quality)
317 case QSSGRenderLayer::AAQuality::Normal:
319 case QSSGRenderLayer::AAQuality::High:
321 case QSSGRenderLayer::AAQuality::VeryHigh:
friend class QSSGLayerRenderData