Какую часть ты не понимаешь? Ошибка очевидна: какой бы буфер вы ни прикрепили к атрибуту 2, он недостаточно велик для обработки запроса propellerStart, points.length
.
Итак, во-первых, выясните, какой атрибут является атрибутом 2. Сделайте это, распечатав расположение атрибутов. Твои очки, нормали или текскорды?
Вы уже должны искать их где-нибудь с gl.getAttribLocation
, поэтому распечатайте эти значения, выясните, какое из них # 2.
Затем посмотрите на размер буфера, который вы прикрепили к этому атрибуту. Чтобы сделать это где-то вы бы позвонили.
gl.bindBuffer(gl.ARRAY_BUFFER, someBuffer);
gl.vertexAttribPointer(locationForAttribute2, size, type, normalize, stride, offset);
Итак, мы знаем, что это someBuffer
из приведенного выше кода. Нам также нужно знать size
, type
, stride
и offset
Где-то еще вы заполнили этот буфер данными, используя
gl.bindBuffer(gl.ARRAEY_BUFFER, someBuffer);
gl.bufferData(gl.ARRAY_BUFFER, someData, ...);
Так что вам нужно найти размер someData.
sizeOfBuffer = someData.length * someData.BYTES_PER_ELEMENT
Давайте представим, что это элемент 1000 Float32Array
, поэтому someData.length равно 1000, а someData.BYTES_PER_ELEMENT
равно 4, поэтому sizeOfBuffer
равно 4000.
Используя все это, вы теперь можете проверить, не слишком ли мал ваш буфер. (примечание: мы уже знаем, что он слишком мал, поскольку браузер сказал нам об этом, но если вы хотите знать, как его вычислить самостоятельно)
Допустим, size
равно 3, type
равно gl.FLOAT
, stride
равно 32, offset
равно 12 (примечание: лично я никогда не использую ничего, кроме шага = 0 и смещения = 0)
Допустим, points.length = 50
numPoints = points.length;
bytesPerElement = size * 4; // because a gl.FLOAT is 4 bytes
realStride = stride === 0 ? bytesPerElement : stride;
bytesNeeded = realStride * (numPoints - 1) + bytesPerElement;
bytesNeeded
в этом случае (64 * 49) + 12 = 3148
Итак, теперь мы знаем, сколько нужно байтов. Достаточно ли данных в буфере? Мы, когда вы уравняете ничью, сдали вам смещение propellerStart
. Давайте предположим, что это 900, и в атрибуте есть offset
.
bufferSizeNeeded = offset + propellerStart + bytesNeeded
так bufferSizeNeeded = 12 + 900 + 3148
что составляет 4060. Поскольку 4060>> 1052 *, что было 4000, вы получите ошибку, которую вы получили.
В любом случае, на самом деле вам нужно выяснить, какой буфер используется атрибутом # 2, а затем посмотрите, почему ваш буфер слишком мал. Ваше смещение на drawArrays неверно? Ваш шаг слишком велик? Является ли ваше смещение неправильным в vertexAttribPointer (это количество байтов, а не количество единиц). Вы поставили неправильный размер (1,2,3,4). Вы неправильно рассчитали количество баллов?