Graphics Reference
In-Depth Information
These are followed by a call to send the framebuffer to the display, which is
often called a
buffer swap.
An abstracted implementation of this process might
look like Listing 15.35. This is called from a main rendering loop, such as List-
ing 15.36.
Listing 15.35: Host code to set fixed-function state and shader arguments, and
to launch a draw call under an abstracted hardware API.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void
loopBody(RenderDevice
*
gpu) {
gpu->setColorClearValue(Color3::cyan()
*
0.1f);
gpu->clear();
const
Light
& light = scene.lightArray[0];
for
(
unsigned int
m = 0; m < scene.meshArray.size(); ++m) {
Args
args;
const
Mesh& mesh = scene.meshArray[m];
const
shared_ptr<
BSDF
>& bsdf = mesh.bsdf();
args.setUniform(
"fieldOfViewX"
,
camera.fieldOfViewX);
args.setUniform(
"zNear"
,
camera.zNear);
args.setUniform(
"zFar"
,
camera.zFar);
args.setUniform(
"lambertian"
,
bsdf->lambertian);
args.setUniform(
"glossy"
,
bsdf->glossy);
args.setUniform(
"glossySharpness"
,
bsdf->glossySharpness);
args.setUniform(
"lightPosition"
,
light.position);
args.setUniform(
"lightPower"
,
light.power);
args.setUniform(
"shadowMap"
,
shadowMap);
args.setUniform(
"width"
,
gpu->width());
args.setUniform(
"height"
,
gpu->height());
gpu->setShader(shader);
mesh.sendGeometry(gpu, args);
}
gpu->swapBuffers();
}
Listing 15.36: Host code to set up the main hardware rendering loop.
1
2
3
4
5
6
7
8
9
10
11
OSWindow::Settings osWindowSettings;
RenderDevice
*
gpu =
new
RenderDevice();
gpu->init(osWindowSettings);
// Load the vertex and pixel programs
shader = Shader::fromFiles(
"project.vrt"
,
"shade.pix"
);
shadowMap = Texture::createEmpty(
"Shadow map"
, 1024, 1024,
ImageFormat::DEPTH24(), Texture::DIM_2D_NPOT, Texture::Settings::shadow());
makeTrianglePlusGroundScene(scene);