[Interest] [Qt3D] Frustum culling
Sean Harmer
sean.harmer at kdab.com
Fri Jul 1 17:37:53 CEST 2016
Hi,
On Wednesday 29 June 2016 22:38:13 Émeric MASCHINO wrote:
> Hi,
>
> I don't understand how frustum culling works with Qt3D (Qt 5.7 as time
> of writing).
>
> From QFrustumCulling documentation [1]: "If present, only tries to
> draw entities that are in the view of the camera. The camera is
> selected by a QCameraSelector frame graph node in the current
> hierarchy."
>
> How "If present" should be interpreted? I mean, how/where in the
> framegraph should QFrustumCulling be created/added/made a child of
> what?
The node should be far enough up the tree that is encompasses all the leaf
nodes to which you wish to apply frustum culling.
> I thus had a look at Qt3DExtras::QForwardRenderer source code [2].
> There, QFrustumCulling is simply made a child of a QClearBuffers
> instance. But that's all. Is this sufficient to enable frustum
> culling? And why not making it a child of the camera selector
> (m_cameraSelector member)?
Either way works. The renderer works by doing a "pass" for each leaf node in
the frame graph. Each "pass", known as a RenderView, collects state from the
leaf node up to the root node of the frame graph. So as long as the culling
node is somewhere in that path, it will be applied.
> If there's a reason that QFrustumCulling is a child of a QClearBuffers
> instance, how would it work for multiple viewports like in the Multi
> Viewports QML Example (there's no FrustumCulling instance there, hence
> my question) [3]? I mean, all the viewports in the framegraph there
> "share" a common ClearBuffers instance, but each viewport selects a
> distinct camera, with a different point of view. The view frustum is
> thus different for each viewport. If I had to enable frustum culling
> in this example, should I put one instance only as a child of the main
> viewport (like the ClearBuffers instance) or should I have one
> FrustumCulling as a child of the top left viewport, another one as a
> child of the top right viewport, and so on?
Either, but having a single instance will result in slightly less work on the
backend. Usually, you should propagate state that changes infrequently during
a frame up towards the root of the framegraph. Think of each depth level in
the frame graph as representing a different rate of change. The root node is
constant over the whole frame whereas the leaf nodes define a section of the
frame. Nodes in between vary with relative frequency to their depth in the
frame graph.
> Last but not least, is frustum culling really implemented? Source code
> seems... well, simple [4]. There was a related bug report, but I can't
> read that much history [5].
Frustum culling is simple once you have the bounding volumes for entities and
the planes forming the view frustum. These are computed elsewhere to where the
culling is actually performed. The culling is currently performed at:
http://code.qt.io/cgit/qt/qt3d.git/tree/src/render/backend/renderview.cpp#n541
We are actually in the process of parallelising much more of the work that Qt
3D does on the backend. So shortly this will be done in a separate job:
https://codereview.qt-project.org/#/c/159300/
Hope this helps,
Sean
>
> Thanks,
>
> Émeric
>
>
> [1] http://doc.qt.io/qt-5/qt3drender-qfrustumculling.html
> [2]
> https://github.com/qt/qt3d/blob/dev/src/extras/defaults/qforwardrenderer.cp
> p [3] http://doc.qt.io/qt-5/qt3d-multiviewport-example.html
> [4]
> https://github.com/qt/qt3d/blob/dev/src/render/framegraph/qfrustumculling.c
> pp [5] https://bugreports.qt.io/browse/QTBUG-42535
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/interest
--
Dr Sean Harmer | sean.harmer at kdab.com | Managing Director UK
Klarälvdalens Datakonsult AB, a KDAB Group company
Tel. UK +44 (0)1625 809908, Sweden (HQ) +46-563-540090
KDAB - Qt Experts - Platform-independent software solutions
More information about the Interest
mailing list