Эта ошибка возникает при переполнении циклов цикла. Давайте рассмотрим простой пример:
class demo{
public static void main(String a[]){
int[] numberArray={4,8,2,3,89,5};
int i;
for(i=0;i<numberArray.length;i++){
System.out.print(numberArray[i+1]+" ");
}
}
Сначала я инициализировал массив как «numberArray». то некоторые элементы массива печатаются с использованием цикла. Когда цикл запускает время «i», напечатайте элемент (numberArray [i + 1] .. (когда значение i равно 1, будет напечатан элемент numberArray [i + 1].) Предположим, что, когда i = (numberArray. length-2), последний элемент массива печатается. Когда значение «i» переходит к (numberArray.length-1), нет значения для печати. В этот момент происходит «ArrayIndexOutOfBoundsException». Я надеюсь, что вы можете получить idea.thank you!
Добавление ответа, поскольку принятый ответ содержит много информации, не относящейся к WebGL2
Во время инициализации вы звоните uniformBlockBinding
. Для данной программы она устанавливает, с какой точки привязки индекса унифицированного буфера эта конкретная программа получит конкретный унифицированный буфер.
Во время рендеринга вы вызываете bindBufferRange
или bindBufferBase
для привязки определенного буфера к определенной точке привязки индекса унифицированного буфера
Если вам также необходимо загрузить новые данные в этот буфер, вы можете затем вызвать bufferData
В псевдокоде
// at init time
for each uniform block
gl.uniformBlockBinding(program, indexOfBlock, indexOfBindPoint)
// at render time
for each uniform block
gl.bindBufferRange(gl.UNIFORM_BUFFER, indexOfBindPoint, buffer, offset, size)
if (need to update data in buffer)
gl.bufferData/gl.bufferSubData(gl.UNIFORM_BUFFER, data, ...)
Обратите внимание, что «правильной» последовательности не существует. Проблема в том, что как вы обновляете свои буферы, действительно зависит от вас. Поскольку вы можете хранить несколько унифицированных данных буфера в одном буфере с разными смещениями, то вызов gl.bufferData/gl.bufferSubData
, как описано выше, на самом деле не является «правильным», это всего лишь один способ из 100 с.
WebGL2 (GLES 3.0 ES) не поддерживает layout(binding = x)
, упомянутый в принятом ответе. Также нет такой вещи как glGenBuffers
в WebGL2
Ни один не является «более правильным», чем другой; они все работают. Но если вы говорите о разделении интересов, то первый лучше подчеркивает правильное разделение.
glUniformBlockBinding
изменяет программу ; это не влияет на природу объекта буфера или состояние буфера контекста. Действительно, по всем правилам этот вызов даже не должен быть в одной и той же функции ; это часть настройки программного объекта. В современном учебном пособии по GL они будут использовать layout(binding=X)
для установки привязки , поэтому функция даже не появится. Для более старого кода его следует установить равным известному постоянному значению после создания программы, а затем оставить его в покое.
Таким образом, вызов функции между выделением памяти для буфера и привязкой ее к индексированной точке привязки для использования создает впечатление, что они должны вызывать glUniformBlockBinding
каждый кадр, что является неправильным впечатлением.
И если говорить о неправильных впечатлениях, glBindBufferBase
даже не следует вызывать туда. Остальная часть этого кода является кодом настройки буфера; это должно быть сделано только один раз, в начале заявки. glBindBufferBase
должен вызываться как часть процесса рендеринга, а не как процесс установки. В хорошем приложении этот вызов не должен находиться рядом с вызовом glGenBuffers
.