Мне нужно прочитать пиксели моего фреймбуфера как значения с плавающей запятой. Моя цель — получить быструю передачу большого количества частиц между процессором и графическим процессором и обработать их в реальном времени. Для этого я сохраняю свойства частиц в текстуре с плавающей запятой.
Всякий раз, когда добавляется новая частица, я хочу вернуть текущий массив частиц из текстуры, добавить новые свойства частиц, а затем вписать их обратно в текстуру (это единственный способ, который я мог придумать, чтобы динамически добавлять частицы и обрабатывать их). с точки зрения графического процессора).
Я использую WebGL 2, так как он поддерживает обратное чтение пикселей в цель PIXEL_PACK_BUFFER
. Я тестирую свой код в Firefox Nightly. Рассматриваемый код выглядит следующим образом:
// Initialize the WebGLBuffer
this.m_particlePosBuffer = gl.createBuffer();
gl.bindBuffer(gl.PIXEL_PACK_BUFFER, this.m_particlePosBuffer);
gl.bindBuffer(gl.PIXEL_PACK_BUFFER, null);
...
// In the renderloop, bind the buffer and read back the pixels
gl.bindBuffer(gl.PIXEL_PACK_BUFFER, this.m_particlePosBuffer);
gl.readBuffer(gl.COLOR_ATTACHMENT0); // Framebuffer texture is bound to this attachment
gl.readPixels(0, 0, _texSize, _texSize, gl.RGBA, gl.FLOAT, 0);
Я получаю эту ошибку в моей консоли:
TypeError: Argument 7 of WebGLRenderingContext.readPixels could not be converted to any of: ArrayBufferView, SharedArrayBufferView.
Но, глядя на текущую спецификацию WebGL 2, вызов этой функции должен быть возможен. Использование типа gl.UNSIGNED_BYTE
также возвращает эту ошибку. Когда я пытаюсь прочитать пиксели в ArrayBufferView (чего я хочу избежать, поскольку он кажется намного медленнее), он работает с комбинацией формата/типа gl.RGBA
и gl.UNSIGNED_BYTE
для Uint8Array()
, но не с gl.RGBA
и gl.FLOAT
для Float32Array()
- это как и ожидалось, поскольку он задокументирован в спецификации WebGL.
Я благодарен за любые предложения о том, как получить значения плавающих пикселей из моего буфера кадра или о том, как иначе запустить этот конвейер частиц.