Какова правильная последовательность загрузки унифицированного блока?

Эта ошибка возникает при переполнении циклов цикла. Давайте рассмотрим простой пример:

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!

3
задан davidkomer 26 June 2019 в 07:39
поделиться

2 ответа

Добавление ответа, поскольку принятый ответ содержит много информации, не относящейся к 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

0
ответ дан gman 26 June 2019 в 07:39
поделиться

Ни один не является «более правильным», чем другой; они все работают. Но если вы говорите о разделении интересов, то первый лучше подчеркивает правильное разделение.

glUniformBlockBinding изменяет программу ; это не влияет на природу объекта буфера или состояние буфера контекста. Действительно, по всем правилам этот вызов даже не должен быть в одной и той же функции ; это часть настройки программного объекта. В современном учебном пособии по GL они будут использовать layout(binding=X) для установки привязки , поэтому функция даже не появится. Для более старого кода его следует установить равным известному постоянному значению после создания программы, а затем оставить его в покое.

Таким образом, вызов функции между выделением памяти для буфера и привязкой ее к индексированной точке привязки для использования создает впечатление, что они должны вызывать glUniformBlockBinding каждый кадр, что является неправильным впечатлением.

И если говорить о неправильных впечатлениях, glBindBufferBase даже не следует вызывать туда. Остальная часть этого кода является кодом настройки буфера; это должно быть сделано только один раз, в начале заявки. glBindBufferBase должен вызываться как часть процесса рендеринга, а не как процесс установки. В хорошем приложении этот вызов не должен находиться рядом с вызовом glGenBuffers.

2
ответ дан Nicol Bolas 26 June 2019 в 07:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: