Автор примера здесь. Проблема, как вы подозревали, связана с окраской куба.
Чтобы понять код такого типа проще всего, нужно думать о "вершинах" WebGL как о не просто простых точках в пространстве, а как о пакетах атрибутов. Конкретной вершиной может быть пучок <(1, -1, 1), красный>. Другая вершина, которая находилась в той же точке пространства, но имела другой цвет (например, <(1, -1, 1), зеленый>), была бы совершенно другой версией, если речь идет о WebGL.
Таким образом, в то время как куб имеет только 8 вершин в математическом смысле точек в пространстве, если вы хотите иметь разный цвет для каждой грани, каждая из этих точек должна быть занята тремя разными вершинами, по одной на цвет - что делает 8x3 = 24 вершины в смысле WebGL.
Это не очень эффективно с точки зрения памяти, но она дешевая по сравнению с мощностью процессора, которая требуется для более нормализованного представления для эффективной обработки.
Надеюсь, что проясняет вещи.