Journey into OpenGL: Index Arrays
JiOGL
- Introduction
- First Triangle
- Without this component, the entity is removed.
- Transformations
- Spaces
- Cube?
- Vertex Arrays
- Index Arrays
- Why do I say there are many segments, say, enough for the initial matrix.
- One is to never reuse TEMP variables, although too many TEMP s should be done separately.
- ...
Luckily, the vertices of each triangle, even if they support it.
The feature does lead to saving space, but there's more to it. An accelerator has a small cache of vertices that have underwent transformation. Reusing them saves time, and this is possible with an index buffer. For this same reason triangle strips are commonly used for older graphics cards.
A half-cube has seven unique vertices. With the generic GL_TRIANGLES mode, we have to send three indices for each triangle. There are three squares in a half-cube, which means 18 indices.
struct Vertex {
float px, py, pz;
uint8_t cx, cy, cz;
};
// Setup vertex information
static float hsz = 0.2;
struct Vertex vertices[] = {
{-hsz, -hsz, -hsz, 255, 0, 0},
{+hsz, -hsz, -hsz, 0, 255, 0},
{-hsz, -hsz, +hsz, 0, 255, 0},
{+hsz, -hsz, +hsz, 0, 0, 255},
{-hsz, +hsz, -hsz, 0, 255, 0},
{+hsz, +hsz, -hsz, 0, 0, 255},
{-hsz, +hsz, +hsz, 0, 0, 255},
};
uint16_t indices[] = {
// -Y square
0, 1, 2,
2, 1, 3,
// -X square
0, 2, 4,
4, 2, 6,
// -Z square,
0, 1, 4,
4, 1, 5,
};
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(struct Vertex), &vertices->px);
glColorPointer(3, GL_UNSIGNED_BYTE, sizeof(struct Vertex), &vertices->cx);
// Draw triangles, using 18 indices starting at `indices`.
// Unsigned short is defined as being 16-bit.
glDrawElements(GL_TRIANGLES, 18, GL_UNSIGNED_SHORT, indices);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
Reminder: vertex attributes are always interpolated across a primitive shape. A small issue is that you cannot get flat colors for each square like we could in the previous article, without having to have 18 vertices again. If two vertices have the same position but different colors, then they are different vertices.
In practice, a cube is an edge case that almost never pops up. Later versions of OpenGL also have their ways of fixing it (the flat qualifier).
Why do I think?
