Скопировать данные кадрового буфера из одного WebGLRenderingContext в другой? - PullRequest
0 голосов
/ 09 мая 2019

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

У меня есть дваWebGLRenderingContexts со следующими чертами:

  • WebGLRenderingContext: InputGL (разрешает операции чтения и записи для своих кадровых буферов.)
  • WebGLRenderingContext: OutputGL (Позволяет только записывать операций на свои кадровые буферы.)

GOAL : накладывать рендеринг 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 в сочетании с невыпущенным WebXR API .WebXR использует свой собственный модифицированный WebGLRenderingContext, который запрещает чтение из своих буферов (из соображений конфиденциальности).Однако Unity WebGL требует чтения из своих буферов.То, что оба работают на одном и том же WebGLRenderingContext, приводит к ошибкам в операциях чтения Unity, что означает, что их необходимо хранить отдельно.Идея состоит в том, чтобы периодически накладывать данные кадрового буфера Unity на кадровые буферы WebXR.

WebGL2 также поддерживается в случае необходимости.

1 Ответ

1 голос
/ 09 мая 2019

Вы не можете делиться ресурсами между контекстами.

Лучшее, что вы можете сделать, - это использовать один из них в качестве источника для другого через texImage2D

Например, если контекст использует холст, нарисуйте кадровый буфер на холст, а затем

destContext.texImage2D(......., srcContext.canvas);

Если это OffscreenRenderingContext, используйте transferToImageBitmap, а затем передайте полученный битовый массив в texImage2D

...