\begin{figure}[tbp]
\centering
\begin{tikzpicture}[>=Latex, node distance=10mm and 6mm]
\node[draw, rounded corners, fill=blue!8, minimum width=20mm, minimum height=9mm, align=center] (append) {append\\geometry};
\node[draw, rounded corners, fill=blue!8, minimum width=20mm, minimum height=9mm, align=center, right=of append] (bbox) {bbox\\and grid};
\node[draw, rounded corners, fill=green!9, minimum width=20mm, minimum height=9mm, align=center, right=of bbox] (partition) {partition};
\node[draw, rounded corners, fill=green!9, minimum width=20mm, minimum height=9mm, align=center, right=of partition] (filter) {filter};
\node[draw, rounded corners, fill=yellow!15, minimum width=20mm, minimum height=9mm, align=center, right=of filter] (sort) {SCC\\sort};
\node[draw, rounded corners, fill=orange!15, minimum width=20mm, minimum height=9mm, align=center, right=of sort] (render) {render\\paths};

\draw[->, thick] (append) -- (bbox);
\draw[->, thick] (bbox) -- (partition);
\draw[->, thick] (partition) -- (filter);
\draw[->, thick] (filter) -- (sort);
\draw[->, thick] (sort) -- (render);

\node[draw, rounded corners, fill=teal!10, minimum width=24mm, minimum height=9mm, align=center, below=17mm of sort] (labels) {labels\\held aside};
\draw[->, thick] (append.south) |- (labels.west);
\draw[->, thick] (labels.east) -| (render.south);

\node[align=center, font=\footnotesize] at ($(bbox.north)+(0,0.95)$) {candidate pairs\\only};
\node[align=center, font=\footnotesize] at ($(partition.north)+(0,1.00)$) {split only when\\local depth order fails};
\node[align=center, font=\footnotesize] at ($(sort.north)+(0,0.95)$) {cycle handling and\\topological order};
\node[align=center, font=\small] at ($(labels.south)+(0,-0.70)$) {labels bypass the occlusion pipeline and are emitted last};
\end{tikzpicture}
\caption{The scene model. Geometry is appended first and processed only at
display time; labels are stored with the scene but bypass most of the visibility
machinery before being emitted last.}
\end{figure}