Как получить доступ к содержимому текстуры WebGLRenderTarget

Итак, я визуализирую сцену в текстуру, а затем мне нужно обработать текстуру в js и либо изменить содержимое, либо создать новую текстуру из массива значений.

Похоже, мне нужно получить контекст WebGL и напрямую взаимодействовать с WebGL для достижения этой цели. Кто-нибудь знает лучший способ сделать это?


person zumba man    schedule 12.07.2015    source источник
comment
Было бы полезно, если бы вы добавили часть своего кода.   -  person Blubberguy22    schedule 12.07.2015
comment
что вы подразумеваете под обработкой текстуры/изменением содержимого/созданием новой текстуры из массива? Я полагаю, вам нужен rendertarget + фрагментный шейдер   -  person Atrahasis    schedule 12.07.2015


Ответы (1)


В итоге я просто получил контекст webGL от рендерера и вызвал gl.readPixels()

var gl = renderer.getContext();
var framebuffer = renderTarget.__webglFramebuffer;
gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
var data = new Uint8Array(renderTarget.width * renderTarget.height * 4);
gl.readPixels(0,0,renderTarget.width,renderTarget.heigh,gl.RGBA,gl.UNSIGNED_BYTE,data);

(renderTarget является экземпляром THREE.WebGLRenderTarget)

person zumba man    schedule 12.07.2015
comment
Вместо этого вы можете использовать метод WebGLRenderer.readRenderTargetPixels( renderTarget, x, y, width, height, buffer ). - person WestLangley; 13.07.2015
comment
использование любого метода приводит к массиву с сильным смещением либо к 0, либо к 255. Не так много между ними. Я ожидаю много разных поплавков. Любая идея, почему это не поплавки, которые я ожидаю? Я даже добавил { premultipliedAlpha : false } в свой рендерер. - person Jared; 11.10.2015
comment
пиксели определяются как наборы из 4 байтов. Для значений R, G, B и A. если вам нужны числа с плавающей запятой, вам придется отображать каждую запись в этом массиве на 255. Вероятно, лучше всего сделать это встроенным в функцию обработки, а не отображать массив сразу. - person Patrick Gunderson; 02.11.2016