Wenn Sie einen Scheitelpunktpuffer wie diesen haben:
var vertices = [
0.0, 0.0, 0.0,
1.0, 0.0, 0.0,
0.0, 0.6, 0.0,
1.0, 0.6, 0.0,
0.5, 1.0, 0.0
]
Und zeichnen Sie es einfach so wie es ist:
// Create an empty buffer object
var vertex_buffer = gl.createBuffer();
// Bind appropriate array buffer to it
gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer);
// Pass the vertex data to the buffer
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
/* [...] */
// Draw the lines
gl.drawArrays(gl.LINES, 0, 5);
Es würde zwei dedizierte Koordinaten für jedes Liniensegment erfordern. Mit der vertices
oben definierten wäre es nur möglich, zwei Linien zu zeichnen :
Wenn Sie folgende Indizes definiert haben:
var indices = [
0, 2,
2, 4,
4, 3,
3, 2,
2, 1,
1, 0,
0, 3,
3, 1
]
Es ist möglich, Linien zu zeichnen, die immer wieder dieselben Eckpunkte schneiden. Dies reduziert die Redundanz. Wenn Sie den Indexpuffer binden und die GPU anweisen, Liniensegmente zu zeichnen, die die Eckpunkte in der im Indecies-Array angegebenen Reihenfolge verbinden:
var index_buffer = gl.createBuffer();
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, index_buffer);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);
// draw geometry lines by indices
gl.drawElements(gl.LINES, 16, gl.UNSIGNED_SHORT, index_buffer);
Man kann komplexere Figuren zeichnen, ohne dieselben Eckpunkte immer wieder neu zu definieren. Das ist das Ergebnis:
Um das gleiche Ergebnis ohne Indizes zu erzielen, sollte der Scheitelpunktpuffer wie folgt aussehen:
var vertices = [
0.0, 0.0, 0.0,
0.0, 0.6, 0.0,
0.0, 0.6, 0.0,
0.5, 1.0, 0.0,
0.5, 1.0, 0.0,
1.0, 0.6, 0.0,
1.0, 0.6, 0.0,
0.0, 0.6, 0.0,
0.0, 0.6, 0.0,
1.0, 0.0, 0.0,
1.0, 0.0, 0.0,
0.0, 0.0, 0.0,
0.0, 0.0, 0.0,
1.0, 0.6, 0.0,
1.0, 0.6, 0.0,
1.0, 0.0, 0.0
]
/* [...] */
// Draw the lines
gl.drawArrays(gl.LINES, 0, 16);
Was zu demselben Bild führt:
Beachten Sie die enorme Redundanz in gespeicherten Scheitelpunkten.