Попытка WebGL получить доступ к вершинам вне диапазона в ошибке атрибута 2 - PullRequest
0 голосов
/ 27 апреля 2018

Я знаю, что этот вопрос задавался довольно часто, но ни одно из решений не подходит для моего случая. Я ищу, чтобы добавить второй тип объекта на холст с кодом, показанным ниже. Я знаю, я не предоставил много, но это быстрый старт. Просто попросите больше, если вы думаете, что у вас есть предчувствие. Этот код ниже находится в моей функции рендеринга.

Пока я проверил, что

  1. У меня достаточно вершин в массиве точек
  2. В моем массиве нормалей достаточно нормальных векторов
  3. У меня достаточно текстурных координат в моем массиве texCoords
  4. Нет никаких несоответствий между векторами, добавленными при создании моей местности и моего пропеллера.

Рельеф местности очень хорошо сочетается с текстурой, освещением и всем, но я не могу заставить пропеллер рендериться. Я получаю ошибку, которую я перечислил выше. Я уже добавил несколько объектов к полотнам и никогда не сталкивался с такой ошибкой.

//----------------------------------------- Draw Terrain ------------------------------------
  var i = 0;
  for(var row=0-dimension; row<dimension; row+=3){
    for(var col=0-dimension; col<dimension; col+=3, i++){
      var mv = mult(viewer, mult(translate(row, -1, col), mult(scale[i],rot[i])));
      gl.uniformMatrix4fv(modelViewLoc, false, flatten(mv));
      gl.uniformMatrix3fv(normalLoc, false, flatten(normalMatrix(mv, true)));
      gl.drawArrays( gl.TRIANGLES, 0, index);
    }
  }

  //----------------------------------------- Draw Propeller ------------------------------------
  mv = mult(viewer, mult( translate(-2.1, -2.9, -.2), scalem(4,5,5)));
  gl.uniformMatrix4fv(modelViewLoc, false, flatten(mv));
  gl.uniformMatrix3fv(normalLoc, false, flatten(normalMatrix(mv, true)));
  gl.drawArrays( gl.TRIANGLES, propellerStart, points.length);

Есть ли способ, которым я могу использовать «Атрибут 2» в сообщении об ошибке, чтобы отследить переменную, дающую мне эту проблему?

Ценю помощь!

1 Ответ

0 голосов
/ 27 апреля 2018

Какую часть ты не понимаешь? Ошибка очевидна: какой бы буфер вы ни прикрепили к атрибуту 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). Вы неправильно рассчитали количество баллов?

...