Improving Rendering Efficiency
[
348 
]
Making use of the quad-tree
A classic quad-tree structure decomposes the whole 2D region into four square children 
(we call them cells here), and recursively subdivides each cell into four regions, un瑩l a cell 
reaches its target capacity and stops spli瑴ng (a so-called leaf). Each cell in the tree either 
has exactly four children, or has no children. It is mostly useful for represen瑩ng terrains or 
scenes on 2D planes.
The quad-tree structure is useful for view-frustum culling terrain data. Because the terrain 
is divided into small pieces that are a part of it, we can easily render pieces of small data in 
the frustum, and discard those that are invisible. This can effec瑩vely unload a large number 
of chunks of a terrain from memory at a 瑩me, and load them back when necessary—which is 
the basic principle of dynamic data paging. This process can be progressive: when the terrain 
model is far enough from the viewer, we may only handle its root and first levels. But as it is 
drawing near, we can traverse down to corresponding levels of the quad-tree, and cull and 
unload as many cells as possible, to keep the load balance of the scene.
Time for action – building a quad-tree for massive rendering
This is the last example in our OSG beginners' book, in which we would like to show how 
OSG handles massive data (o晴en massive terrain data) with the quad-tree structure and 
paged nodes (
o
s
g
:
:
P
a
g
e
d
L
O
D
). We are going to construct a terrain model with fake 
eleva瑩on data, and use a recursion to build all child cells of a complete 
q
u
a
d
-
t
r
e
e
. These 
cells are saved into separate files and managed by the 
, which is 
introduced in brief in Chapter 5Managing Scene Graph.
1. 
Include the necessary headers:
#
i
n
c
l
u
d
e
<
s
s
t
r
e
a
m
>
2. 
Define some global variables. These will define the dimensions of a regularly-spaced 
grid of eleva瑩on points, including the data pointer (
g
_
d
a
t
a
), intervals of X and 
Y direc瑩ons (
g
_
d
x
and 
g
_
d
y
), rows and columns of the leaf cell in the quad-tree 
(
g
_
m
i
n
C
o
l
s
and 
g
_
m
i
n
R
o
w
s
), and rows and columns of the en瑩re dataset 
(
g
_
n
u
m
C
o
l
s
and 
g
_
n
u
m
R
o
w
s
):
f
l
o
a
t
g
_
d
x
=
1
.
0
f
;
f
l
o
a
t
g
_
d
y
=
1
.
0
f
;
Pdf splitter - Split, seperate PDF into multiple files in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Explain How to Split PDF Document in Visual C#.NET Application
break up pdf file; pdf split and merge
Pdf splitter - VB.NET PDF File Split Library: Split, seperate PDF into multiple files in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
VB.NET PDF Document Splitter Control to Disassemble PDF Document
break a pdf into separate pages; cannot print pdf file no pages selected
Chapter 12
[
349 
]
3. 
The following figure shows how variables work here:
4. 
These preset global values indicate that we have a 1024x1024 area to be rendered, 
which contains over one million ver瑩ces. This already slows down the rendering 
of normal geometries, but it's far from enough for represen瑩ng a digital terrain. 
Fortunately, we have the quad-tree and paging mechanism, which can solve the 
massive data problem in a nearly perfect way.
5. 
We will first fill the eleva瑩on grid (
g
_
d
a
t
a
) with random points. This is done via 
a simple 
c
r
e
a
t
e
M
a
s
s
i
v
e
D
a
t
a
(
)
func瑩on. To retrieve an eleva瑩on at a certain 
column and row, we have to define an addi瑩onal 
g
e
t
O
n
e
D
a
t
a
(
)
func瑩on. This 
gets the minimum value between the input column/row number and the total  
value with the 
o
s
g
:
:
m
i
n
i
m
u
m
(
)
func瑩on, and then finds the eleva瑩on data 
from the 
g
_
d
a
t
a
pointer:
{
C# PDF: C#.NET PDF Document Merging & Splitting Control SDK
C#.NET PDF Splitter to Split PDF File. In this section, we aims to tell you how to divide source PDF file into two smaller PDF documents at the page index you
acrobat split pdf pages; can print pdf no pages selected
C# Word: .NET Merger & Splitter Control to Merge & Split MS Word
a larger Word file or how to divide source MS Word file into several smaller documents, RasterEdge designs this C#.NET MS Word merger & splitter control SDK.
pdf split file; break a pdf password
Improving Rendering Efficiency
[
350 
]
{
}}
{
}
6. 
The 
c
r
e
a
t
e
F
i
l
e
N
a
m
e
(
)
func瑩on is another important customized func瑩on for 
naming paged data files. It will be used later in this example:
{
"
.
o
s
g
"
;
}
7. 
The core of the quad-tree construc瑩on is the 
o
u
t
p
u
t
S
u
b
S
c
e
n
e
(
)
func瑩on. This 
should be called recursively to build all child cells of a quad-tree, un瑩l an end 
condi瑩on is reached. The 
l
v
x
, and 
y
parameters indicate the depth level of the 
quad-tree cell, as well as the X/Y indices in the current level. The 
c
o
l
o
r
parameter 
is just used for dis瑩nguishing cells in a simple way:
{
}
8. 
The indices of the cell don't equal the real posi瑩on of the eleva瑩on value in the 
g
_
d
a
t
a
pointer. Thus, we have to compute how many eleva瑩on points are 
contained in the current cell, along with the indices of the start/end column and 
row, and then save them for later use:
(
f
l
o
a
t
)
l
v
)
;
(
f
l
o
a
t
)
l
v
)
;
VB.NET Word: Merge Multiple Word Files & Split Word Document
and editing controls, this VB.NET Word merger and splitter library SDK We are dedicated to provide powerful & profession imaging controls, PDF document, image
pdf format specification; break pdf into smaller files
VB.NET TIFF: .NET TIFF Splitting Control to Split & Disassemble
splitting, please follow this link to C#.NET TIFF splitter control tutorial OpenDocumentFile(fileName, New TIFDecoder()) 'use TIFDecoder open a pdf file Dim
pdf will no pages selected; break pdf into multiple pages
Chapter 12
[
351 
]
9. 
Assuming that the root level of a quad-tree is 0, we have a formula that explains the 
previous code segment: 
(
P
o
i
n
t
s
i
n
a
c
e
l
l
)
=
(
T
o
t
a
l
p
o
i
n
t
s
)
/
(
l
e
v
e
l
-
t
h
p
o
w
e
r
o
f
2
)
.
10. 
We can easily figure out that a level 1 cell contains a quarter of all points, and a level 
2 cell contains one sixteenth of them. That means the rendering of four level 1 cells 
s瑩ll requires all data to be drawn, if none of them are culled. So, is there a solu瑩on 
that can reduce the vertex number of these lower levels, that is, to downsample the 
height field in these cells? For example, each level 1 cell of a 1024x1024 dataset has 
512x512 points. If these can be downsampled to 64x64, we will only have to render 
no more than 20,000 points at one 瑩me.
11. 
The answer is absolutely yes. As we have just discussed, the quad-tree can be 
progressively traversed as if it is a LOD (level-of-detail) based graph. Low levels work 
when the model is s瑩ll far away and can't represent too many details, and leaf cells 
will come with uncompressed data only when the viewpoint is near enough.
12. 
We will create the downsampling height field for the current level using the 
o
s
g
:
:
H
e
i
g
h
t
F
i
e
l
d
class, which is derived from 
o
s
g
:
:
S
h
a
p
e
and can be used by 
o
s
g
:
:
S
h
a
p
e
D
r
a
w
a
b
l
e
. Its origin is defined as the bo瑴om-le晴 corner, and the skirt 
height can prevent gaps between two terrain cells:
13. 
We will first check to see if the current cell reaches the last level, by comparing 
the start and end indices with the global 
g
_
m
i
n
C
o
l
s
and 
g
_
m
i
n
R
o
w
s
. If it does, 
we simply allocate the height field with the computed columns and rows and X/Y 
intervals, and read and set each point of the allocated eleva瑩on grid:
{
)
;
Online Split PDF file. Best free online split PDF tool.
RasterEdge Visual C# .NET PDF document splitter control toolkit SDK can not only offer C# developers a professional .NET solution to split PDF document file
pdf file specification; break apart pdf
VB.NET PowerPoint: Merge and Split PowerPoint Document(s) with PPT
Then, here comes the VB.NET PPT document splitter in handy. Note: If you want to see more PDF processing functions in VB.NET, please follow the link.
pdf splitter; break pdf
Improving Rendering Efficiency
[
352 
]
{
{
}
}
}
14. 
Otherwise, we should obtain downsampling data and keep the height field to a 
fixed, low resolu瑩on, using specific 
g
_
m
i
n
C
o
l
s
and 
g
_
m
i
n
R
o
w
s
variables. The 
simplest method here is to pick one point and add it to the 
o
s
g
:
:
H
e
i
g
h
t
F
i
e
l
d
every few points. The X/Y intervals of the eleva瑩on grid should also be changed:
e
l
s
e{
{
{
}
}}
15. 
Set the height field to an 
o
s
g
:
:
S
h
a
p
e
D
r
a
w
a
b
l
e
instance, and set the color. 
Add the shape to 
o
s
g
:
:
G
e
o
d
e
. If this is the leaf cell of the quad-tree, the 
recursion will end:
C# PDF: C# Code to Process PDF Document Page Using C#.NET PDF
C# PDF Page Processing: Split PDF Document - C#.NET PDF splitter control to divide one PDF file into two smaller PDF documents. Recommend this to Google+.
pdf no pages selected to print; break a pdf file
C# PowerPoint - Split PowerPoint Document in C#.NET
RasterEdge Visual C# .NET PowerPoint document splitter control toolkit SDK can not only offer C# developers a professional .NET solution to split PowerPoint
break pdf file into parts; pdf no pages selected
Chapter 12
[
353 
]
16. 
Now we construct the paged nodes for the OSG scene. A quad-tree cell always has 
four children, except for leaf ones. Their levels and indices should be increased 
properly before star瑩ng the next level's recursion call. We also specify four different 
colors, red, green, blue and yellow, for rendering different child cells:
g
r
o
u
p
-
>
a
d
d
C
h
i
l
d
(
)
;
g
r
o
u
p
-
>
a
d
d
C
h
i
l
d
(
)
;
g
r
o
u
p
-
>
a
d
d
C
h
i
l
d
(
g
r
o
u
p
-
>
a
d
d
C
h
i
l
d
(
)
;
17. 
The paged LOD node represen瑩ng the current quad-tree level can be made up 
of two children: a rough model (the downsampled height field) that is cached for 
displaying at a far distance, and the fine "model" which actually consists of four 
cells describing the next level in the quad-tree. Because the next level can s瑩ll be 
described as paged LOD nodes, we actually build a quad-tree style scene graph full 
of 
o
s
g
:
:
P
a
g
e
d
L
O
D
nodes. The group node of next level cells can be saved into a 
separate file, with the filename being generated by 
c
r
e
a
t
e
F
i
l
e
N
a
m
e
(
)
:
18. 
The paged LOD node must have a valid bounding sphere in order to make it correctly 
pass the view-frustum culling. Here, we have to successively set the center mode to 
user-defined, and define the center and radius of our customized bounding sphere. 
A晴er that, we will set the visibility ranges of two child levels of the LOD node. The 
c
u
t
o
f
f
parameter is just an empirical value:
Improving Rendering Efficiency
[
354 
]
19. 
In the main entry, the 
c
r
e
a
t
e
M
a
s
s
i
v
e
D
a
t
a
(
)
func瑩on must be the first thing 
executed, in order to allocate the global terrain data. And we can add the root  
of the quad-tree to an 
o
s
g
:
:
G
r
o
u
p
root node and save it into a file, too:
r
o
o
t
-
>
a
d
d
C
h
i
l
d
(
d
e
l
e
t
e
g
_
d
a
t
a
;
r
e
t
u
r
n
0
;
20. 
Assuming that the executable name is 
M
y
P
r
o
j
e
c
t
.
e
x
e
. Now we can just enter 
the console mode and enter:
#
M
y
P
r
o
j
e
c
t
.
e
x
e
21. 
The result is smooth and clear. We have just built a terrain model using customized 
eleva瑩on points. Looking from far away, it is obviously divided into four pieces, 
which is in fact the first four square cells of the quad-tree:
22. 
Move towards the terrain and you will see more detailed height fields within 
different cells of different levels:
Chapter 12
[
355 
]
23. 
The most detailed data will only be rendered when the viewer is very close to the 
ground. This is because the last four leaf cells of the quad-tree can only be loaded 
when the highest level of paged nodes is reached by the OSG backend:
Improving Rendering Efficiency
[
356 
]
W
h
a
t
j
u
s
t
h
a
p
p
e
n
e
d
?
In this last example of this book, we haven't provided anything new, but have only made use of 
the same, known node and drawable types (
o
s
g
:
:
P
a
g
e
d
L
O
D
and 
o
s
g
:
:
H
e
i
g
h
t
F
i
e
l
d
) that 
we have already seen elsewhere in the book, as well as a world famous algorithm—quad-tree
to construct a complex scene graph that can perform dynamic scene paging, smoothly.
Obviously, there is a lot more work to do before we can put this small example into prac瑩cal 
use. Terrain data with non-power-of-two row or column numbers may produce incorrect 
results at present. The concept of coordinate system datum (for instance, WGS84) is not 
included, so geometric earth models will not be creatable. The randomly-generated height 
data is also not ideal at all. Some 
.
g
e
o
t
i
f
f
format imagery and eleva瑩on data may be good 
enough as a replacement, if you have an interest in extending the example in any way.
Pop quiz – number of created levels and files
The quad-tree crea瑩on example generates 86 files at one 瑩me in order to construct a 
complete quad-tree of four levels (L0-L3). Can you tell the reason why we have exactly four 
levels of terrain cells, and how each of the 86 files indicate their loca瑩ons and indices within 
the tree hierarchy?
Have a go hero – testing a new terrain creation tool
Finally, we would like to introduce an independent terrain database crea瑩on tool named 
VirtualPlanetBuilder (or VPB for short), which reads a wide range of geospa瑩al imagery and 
eleva瑩on data, and builds small pieces of terrain area with layers of paged LOD nodes. The 
previous example code actually comes from the theory of the VPB project.
VPB mainly depends on the OSG project and the third-party GDAL project. VPB is 
described and provided at: 
And  GDAL can be found at:
A晴er downloading the source code, use CMake to build na瑩ve solu瑩ons or makefiles, choose 
A
L
L
_
B
U
I
L
D
in your Visual Studio interface (or use 
m
a
k
e
i
n
s
t
a
l
l
in the UNIX shell), and 
obtain the VPB libraries and u瑩li瑩es. Use the 
v
p
b
m
a
s
t
e
r
executable to quickly build an OSG 
na瑩ve format terrain from 
.
g
e
o
t
i
f
f
files, such as:
Because of the ability to handle a mul瑩-terabyte database, create 瑩les across networks  
of computers, and read mul瑩 source imagery and DEM file formats, VPB can be used as 
a complete terrain-crea瑩on tool. You will always have the 瑩me to taste it and see if it can 
build the whole world for your applica瑩ons. So good luck with it!
Chapter 12
[
357 
]
A demo database generated by VPB can be found on the web. You may use the 
o
s
g
v
i
e
w
e
r
u瑩lity to view it, unless you don't have the 
o
s
g
d
b
_
c
u
r
l
plug-in built (it requires the libcurl 
library):
For more informa瑩on about earth and terrain rendering, have a look at the osgEarth project 
(
h
t
t
p
:
/
/
o
s
g
e
a
r
t
h
.
o
r
g
/
). This does a similar job, by alterna瑩ve crea瑩ng terrain 瑩les 
offline or at run-瑩me.
Summary
This beginners' book can only help you to develop a general ability to develop 3D 
applica瑩ons with OSG, as well as looking for resources and implementa瑩ons in the source 
code and community by themselves. But to master OSG's usage and construct your own 
projects with it, the only way to Rome will be to prac瑩ce, prac瑩ce, and prac瑩ce. It is also a 
good prac瑩ce to share your opinions, and contribute to the open source community all the 
瑩me, because discussions and communica瑩ons are always necessary processes to improve 
ourselves, too.
In this chapter, we specially covered:
‹
Making use of the OpenThreads library to develop mul瑩threaded programs
‹
How to understand and choose different threading models in OSG, including the 
single-threaded, thread-per-graphics-context, and thread-per-camera models
‹
A basic occlusion culling implementa瑩on with the 
o
s
g
:
:
O
c
c
l
u
d
e
r
N
o
d
e
class
‹
A basic texture sharing implementa瑩on for different external files using the 
and 
‹
The quad-tree structure and its ini瑩al implementa瑩on for building large terrain data 
in OSG, as well as a brief introduc瑩on of the professional crea瑩on tool VPB
Documents you may be interested
Documents you may be interested