44 enum class AAMode : quint8
52 enum class TAAMode : quint8
58 enum class AAQuality : quint8
65 enum class HorizontalField : quint8
72 enum class VerticalField : quint8
79 enum class UnitType : quint8
85 enum class Background : quint8
94 enum class TonemapMode : quint8
103 static size_t
constexpr TonemapModeCount = 6;
107 EnableDepthTest = 0x1,
108 EnableDepthPrePass = 0x2,
111 Q_DECLARE_FLAGS(LayerFlags, LayerFlag)
113 enum class MaterialDebugMode : quint8
130 enum class OITMethod : quint8
136 enum class DirtyFlag : quint8
140 using FlagT = std::underlying_type_t<DirtyFlag>;
142 static constexpr DirtyFlag DirtyMask { std::numeric_limits<FlagT>::max() };
144 [[nodiscard]]
bool isDirty(DirtyFlag dirtyFlag = DirtyMask)
const
146 return ((m_layerDirtyFlags & FlagT(dirtyFlag)) != 0)
147 || ((dirtyFlag == DirtyMask) && QSSGRenderNode::isDirty());
149 void markDirty(DirtyFlag dirtyFlag);
150 void clearDirty(DirtyFlag dirtyFlag);
152 void ref(QSSGRenderRoot *inRootNode)
154 rootNode = inRootNode;
155 rootNodeRef = &rootNode;
158 QSSGRenderRoot *rootNode =
nullptr;
160 QSSGRenderLayerHandle lh;
163 QSSGRenderEffect *firstEffect;
164 QSSGLayerRenderData *renderData =
nullptr;
165 enum class RenderExtensionStage { TextureProviders, Underlay, Overlay, Count };
166 QList<QSSGRenderExtension *> renderExtensions[size_t(RenderExtensionStage::Count)];
168 QSSGRenderLayer::AAMode antialiasingMode;
169 QSSGRenderLayer::AAQuality antialiasingQuality;
171 QSSGRenderLayer::Background background;
172 QVector3D clearColor;
174 FlagT m_layerDirtyFlags = FlagT(DirtyFlag::TreeDirty);
175 quint8 viewCount = 1;
178 float aoStrength = 0.0f;
179 float aoDistance = 5.0f;
180 float aoSoftness = 50.0f;
182 qint32 aoSamplerate = 2;
183 bool aoDither =
false;
184 bool aoEnabled =
false;
186 constexpr bool ssaoEnabled()
const {
return aoEnabled && (aoStrength > 0.0f && aoDistance > 0.0f); }
189 QSSGRenderImage *lightProbe {
nullptr };
190 struct LightProbeSettings {
191 float probeExposure { 1.0f };
192 float probeHorizon { -1.0f };
193 QMatrix3x3 probeOrientation;
194 QVector3D probeOrientationAngles;
195 } lightProbeSettings;
197 QSSGRenderImage *skyBoxCubeMap =
nullptr;
199 TAAMode temporalAAMode { TAAMode::Off };
200 float temporalAAStrength;
201 float ssaaMultiplier;
202 bool specularAAEnabled;
207 bool temporalAAIsActive;
208 bool progressiveAAIsActive;
209 uint tempAAPassIndex;
210 uint progAAPassIndex;
213 QVarLengthArray<QSSGRenderCamera *, 2> explicitCameras;
215 QVarLengthArray<QSSGRenderCamera *, 2> renderedCameras;
216 QMutex renderedCamerasMutex;
219 TonemapMode tonemapMode;
221 LayerFlags layerFlags { LayerFlag::RenderToTarget,
222 LayerFlag::EnableDepthTest,
223 LayerFlag::EnableDepthPrePass };
226 QRhiShaderResourceBindings *skyBoxSrb =
nullptr;
227 QVarLengthArray<QRhiShaderResourceBindings *, 4> item2DSrbs;
228 bool skyBoxIsRgbe8 =
false;
231 float skyboxBlurAmount = 0.0f;
234 bool gridEnabled =
false;
235 float gridScale = 1.0f;
236 quint32 gridFlags = 0;
237 QRhiShaderResourceBindings *gridSrb =
nullptr;
244 bool enabled =
false;
245 QVector3D color = QVector3D(0.5f, 0.6f, 0.7f);
246 float density = 1.0f;
247 bool depthEnabled =
false;
248 float depthBegin = 10.0f;
249 float depthEnd = 1000.0f;
250 float depthCurve = 1.0f;
251 bool heightEnabled =
false;
252 float heightMin = 10.0f;
253 float heightMax = 0.0f;
254 float heightCurve = 1.0f;
255 bool transmitEnabled =
false;
256 float transmitCurve = 1.0f;
259 QVector<QSSGRenderGraphObject *> resourceLoaders;
261 MaterialDebugMode debugMode = MaterialDebugMode::None;
263 bool wireframeMode =
false;
264 bool drawDirectionalLightShadowBoxes =
false;
265 bool drawPointLightShadowBoxes =
false;
266 bool drawShadowCastingBounds =
false;
267 bool drawShadowReceivingBounds =
false;
268 bool drawCascades =
false;
269 bool drawSceneCascadeIntersection =
false;
270 bool disableShadowCameraUpdate =
false;
271 bool drawCulledObjects =
false;
275 QString lightmapSource;
280 void setProbeOrientation(
const QVector3D &angles);
282 void addEffect(QSSGRenderEffect &inEffect);
283 bool hasEffect(QSSGRenderEffect *inEffect)
const;
285 QSSGRenderNode *importSceneNode =
nullptr;
288 void setImportScene(QSSGRenderNode &rootNode);
289 void removeImportScene(QSSGRenderNode &rootNode);
291 [[nodiscard]]
bool isMsaaEnabled()
const {
return antialiasingMode == AAMode::MSAA; }
292 [[nodiscard]]
bool isSsaaEnabled()
const {
return antialiasingMode == AAMode::SSAA; }
293 [[nodiscard]]
bool isProgressiveAAEnabled()
const {
return antialiasingMode == AAMode::ProgressiveAA; }
295 [[nodiscard]]
bool isTemporalAAEnabled()
const {
return (temporalAAMode == TAAMode::On) && !isMsaaEnabled(); }
297 static constexpr float ssaaMultiplierForQuality(QSSGRenderLayer::AAQuality quality)
300 case QSSGRenderLayer::AAQuality::Normal:
302 case QSSGRenderLayer::AAQuality::High:
304 case QSSGRenderLayer::AAQuality::VeryHigh:
friend class QSSGLayerRenderData
friend class QSSGRenderer