Итак, я визуализирую сцену в текстуру, а затем мне нужно обработать текстуру в js и либо изменить содержимое, либо создать новую текстуру из массива значений.
Похоже, мне нужно получить контекст WebGL и напрямую взаимодействовать с WebGL для достижения этой цели. Кто-нибудь знает лучший способ сделать это?
Как получить доступ к содержимому текстуры WebGLRenderTarget
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
Вместо этого вы можете использовать метод
WebGLRenderer.readRenderTargetPixels( renderTarget, x, y, width, height, buffer )
.
- person WestLangley; 13.07.2015
использование любого метода приводит к массиву с сильным смещением либо к 0, либо к 255. Не так много между ними. Я ожидаю много разных поплавков. Любая идея, почему это не поплавки, которые я ожидаю? Я даже добавил { premultipliedAlpha : false } в свой рендерер.
- person Jared; 11.10.2015
пиксели определяются как наборы из 4 байтов. Для значений R, G, B и A. если вам нужны числа с плавающей запятой, вам придется отображать каждую запись в этом массиве на 255. Вероятно, лучше всего сделать это встроенным в функцию обработки, а не отображать массив сразу.
- person Patrick Gunderson; 02.11.2016