Скопировать данные кадрового буфера из одного WebGLRenderingContext в другой?
Пожалуйста, обратитесь к справочному разделу ниже, если следующее не имеет особого смысла, я опустил большую часть контекста, чтобы сделать проблему как можно более ясной.
У меня есть два WebGLRenderingContexts со следующими чертами:
- WebGLRenderingContext: InputGL (разрешает операции чтения и записи для своих кадровых буферов.)
- WebGLRenderingContext: OutputGL (разрешает только операции записи в свои кадровые буферы.)
ЦЕЛЬ: Наложение визуализации InputGL на визуализацию OutputGL периодически в течение 33 мс (30 кадров в секунду) на мобильном устройстве.
Кадровые буферы InputGL и OutputGL извлекаются из отдельных процессов. Оба доступны (и с полными кадровыми буферами) в пределах одного обратного вызова window.requestAnimationFrame. Поскольку InputGL требует операций чтения, а OutputGL поддерживает только операции записи, InputGL и OutputGL не могут быть объединены в один WebGLRenderingContext.
Поэтому я хотел бы скопировать содержимое кадрового буфера из InputGL в OutputGL в каждом обратном вызове window.requestAnimationFrame. Это позволяет мне поддерживать чтение / запись на InputGL и использовать только запись на OutputGL. Ни к одному из них не прикреплены (обычные) полотна, так что о наложении холста не может быть и речи. У меня есть следующий код:
// customOutputGLFramebuffer is the WebXR API's extended framebuffer which does not allow read operations
let fbo = InputGL.createFramebuffer();
InputGL.bindFramebuffer(InputGL.FRAMEBUFFER, fbo)
// TODO: Somehow get fbo data into OutputGL (I guess?)
OutputGl.bindFramebuffer(OutputGl.FRAMEBUFFER, customOutputGLFramebuffer);
// Drawing to OutputGL here works, and it gets drawn on top of the customOutputGLFramebuffer
Я не уверен, что для этого требуется привязка в определенном порядке или какие-то манипуляции с текстурами, любая помощь с этим будет принята с благодарностью.
Справочная информация: я экспериментирую с Unity WebGL в сочетании с неизданным API-интерфейсом WebXR. WebXR использует свой собственный модифицированный WebGLRenderingContext, который запрещает чтение из своих буферов (из соображений конфиденциальности). Однако Unity WebGL требует чтения из своих буферов. То, что оба работают на одном и том же WebGLRenderingContext, приводит к ошибкам в операциях чтения Unity, что означает, что они должны храниться отдельно. Идея состоит в том, чтобы периодически накладывать данные кадрового буфера Unity на кадровые буферы WebXR.
WebGL2 также поддерживается в случае, если это требуется.
1 ответ
Вы не можете делиться ресурсами по контексту периода.
Лучшее, что вы можете сделать, это использовать один из них каким-либо методом в качестве источника для другого через texImage2D
Например, если контекст использует холст, нарисуйте кадровый буфер на холст, а затем
destContext.texImage2D(......., srcContext.canvas);
Если это OffscreenRenderingContext
использование transferToImageBitmap
а затем передать полученное растровое изображение texImage2D