Настройка данных буфера в WebGL - PullRequest
0 голосов
/ 24 апреля 2020

Я попытался заполнить буфер данными, прежде чем я вызвал bindBuffer

const triangleBuffer = context.createBuffer();
// context.bindBuffer(context.ARRAY_BUFFER, triangleBuffer);
context.bufferData(context.ARRAY_BUFFER, triangleVertices, context.STATIC_DRAW);

Затем я получил ошибку:

WebGL: INVALID_OPERATION: bufferData: no buffer

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

Разве я не могу просто заполнить созданный буфер перед привязкой к context.ARRAY_BUFFER? Есть ли причины для такого поведения?

1 Ответ

1 голос
/ 24 апреля 2020

ARRAY_BUFFER - это внутренняя переменная WebGL (точнее, это идентификатор внутренней переменной WebGL)

Это эффективно работает следующим образом

context = {
  ARRAY_BUFFER: 34962,  // this is an enum value

  arrayBufferBinding: null,

  bindBuffer(target, buffer) {
    if (target === this.ARRAY_BUFFER) {
      this.arrayBufferBinding = buffer;
    }
    ...
  },

  bufferData(target, data, hint) {
    let buffer;
    if (target === this.ARRAY_BUFFER) {
      buffer = this.arrayBufferBinding;
    }
    ...
    setDataOnBuffer(buffer, data, hint);
  },
};

Так Вы должны связать буфер. WebGL не устанавливает напрямую состояние большинства объектов WebGL (буферов, текстур, буферов рендеринга, кадровых буферов, массивов вершин). Вы должны связать объект, а затем ссылаться на него в зависимости от того, где вы его связали.

См. это и это

...