Jeśli masz taki bufor wierzchołków:
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
]
I po prostu narysuj go takim, jakim jest:
// 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);
Wymagałoby to dwóch dedykowanych współrzędnych dla każdego segmentu linii. Przy vertices
zdefiniowanym powyżej, możliwe byłyby tylko dwa narysowanie dwóch linii :
Jeśli zdefiniowano następujące wskaźniki:
var indices = [
0, 2,
2, 4,
4, 3,
3, 2,
2, 1,
1, 0,
0, 3,
3, 1
]
Możliwe jest rysowanie linii, które przecinają te same wierzchołki raz za razem. Zmniejsza to nadmiarowość. Jeśli powiążesz bufor indeksu i powiesz GPU, aby narysował segmenty linii łączące wierzchołki w kolejności określonej w tablicy indecies:
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);
Można rysować bardziej złożone figury bez ponownego definiowania tych samych wierzchołków. Oto wynik:
Aby osiągnąć ten sam wynik bez indeksów, bufor wierzchołków powinien wyglądać następująco:
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);
Co daje ten sam obraz:
Zwróć uwagę na ogromną redundancję w przechowywanych wierzchołkach.