Чтение пикселей в WebGL 2 как значений с плавающей запятой

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

Всякий раз, когда добавляется новая частица, я хочу вернуть текущий массив частиц из текстуры, добавить новые свойства частиц, а затем вписать их обратно в текстуру (это единственный способ, который я мог придумать, чтобы динамически добавлять частицы и обрабатывать их). с точки зрения графического процессора).

Я использую 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.

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


person Feppster    schedule 13.11.2015    source источник


Ответы (3)


Вы пробовали использовать это расширение?

var ext = gl.getExtension('EXT_color_buffer_float');
person Jason Livesay    schedule 21.03.2017

У вас есть gl webgl1, а не webgl2. Попробуйте:

var gl = document.getElementById("canvas").getContext('webgl2');
person KayWang    schedule 16.06.2021

В WebGL2 синтаксис glReadPixel такой:

void gl.readPixels(x, y, width, height, format, type, ArrayBufferView pixels, GLuint dstOffset);

so

let data = new Uint8Array(gl.drawingBufferWidth * gl.drawingBufferHeight * 4);
gl.readPixels(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight, gl.RGBA, gl.UNSIGNED_BYTE, pixels, 0);

https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/readPixels

person takeshi mitsuiami    schedule 04.08.2017