## Cross-platform OpenGL abstractions

Geometric objects can be represented by their surfaces. In this chapter, we are talking only about polygonal graphics, so the data structure of fundamental importance is the *triangular mesh*.

Just as with the digital audio, our convenient API-agnostic data structures should be converted to something native for the graphics API before they can be rendered. Let's start with the representation of triangulated geometry in the 3D space.

A single triangle can be specified by three vertices. Each vertex stores at least its position in the 3D space, as shown in the following figure:

The first thing in implementing a portable renderer, we need to separate geometry storage, which in the most simple case, is just a collection of vertices with their attributes and the order to iterate through these vertices to construct graphical primitives, from any API-specific functions and data types. This kind of data structure is implemented in the `clVertexAttribs`

class:

class clVertexAttribs...