Я не могу привязать текстуру к SurfaceTexture
для отображения в Unity.
Обновление 4: Основано на конвейере в обновлении 1 (поверхность-> внешняя текстура с помощью текстуры поверхности -> fbo -> текстура 2d). Я знаю, что SurfaceTexture
неправильно преобразовывает свою поверхность в текстура. Я могу получить правильно нарисованные изображения с его поверхности с помощью pixelcopy, и я могу подтвердить, что мой рисунок FBO для конвейера texture2d работает с некоторыми тестовыми цветами. Поэтому вопрос в том, почему SurfaceTexture не может преобразовать свою поверхность в текстуру?
Я генерирую Texture
в Java и передаю его указатель обратно Unity:
public void initGLTexture()
{
Log.d("Unity", "initGLTexture");
int textures[] = new int[1];
GLES20.glGenTextures(1, textures, 0);
mTextureId = textures[0];
GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTextureId);
GLES20.glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
}
Я создаю SurfaceTexture
из идентификатора (в Java):
mSurfaceTexture = new SurfaceTexture(mTextureId);
mSurfaceTexture.setDefaultBufferSize(512, 512);
Я использую стороннюю библиотеку, GeckoView , для рендеринга на поверхность SurfaceTexture. Я вызываю следующий метод из OnRenderObject()
Unity, чтобы сохранить все рендеринг GL в одном потоке:
mSurfaceTexture.updateTexImage();
Я знаю, что приведенный выше код позволяет правильно рисовать на поверхности.
Я вызываю следующее в Unity для загрузки текстуры:
_imageTexture2D = Texture2D.CreateExternalTexture(
512,512,TextureFormat.RGBA32,false,true,(IntPtr) mTextureId);
_rawImage.texture = _imageTexture2D;
Почему RawImage
с примененной текстурой показывает только эту похожую на спрайт вещь, которая должна быть веб-страницей?
Обновление 1: Итак, я работаю над гипотезой: используйте Gecko для рисования на поверхности и используйте SurfaceTexture для визуализации этой поверхности в GL_TEXTURE_EXTERNAL_OES
. Поскольку я не могу отобразить это в Unity (не знаю почему), я рисую эту текстуру в буфере кадров и копирую пиксели в буфере кадров в GL_TEXTURE_2D
. Я получаю веб-страницу в texture_2d (в эмуляторе с изображением и glReadPixels
). Однако, когда я импортирую работу в Unity, чтобы проверить, что конвейер в порядке, я просто получаю черный экран. Я МОГУ получить изображения поверхности через PixelCopy
API.
Вот мой обзорный код FBO - мой код рендеринга взят из программы texture2D от Grafika :
// bind display buffer
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, mFrameBufferId);
GlUtil.checkGlError("glbindframebuffer");
// unbind external texture to make sure it's fresh
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, 0);
GlUtil.checkGlError("glunbindexternaltex");
// bind source texture (done in drawFrame as well )
GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, mOffscreenTextureId);
GlUtil.checkGlError("glBindFramebuffer");
// draw to frame buffer
GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // again, only really need to
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); // clear pixels outside rect
mFullScreen.drawFrame(mOffscreenTextureId, mIdentityMatrix);
// unbind source texture
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,0);
GlUtil.checkGlError("glBindTexture2d");
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, 0);
GlUtil.checkGlError("glunbindexternaltex");
// make sure we're still bound to fbo
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, mFrameBufferId);
GlUtil.checkGlError("glBindTexture2d");
// copy pixels from frame buffer to display texture
GLES20.glCopyTexImage2D(GLES20.GL_TEXTURE_2D,0,GLES20.GL_RGBA,0,0,512,512,0);
// read pixels from the display buffer to imageview for debugging
BitmapDisplay.mBitmap = SavePixels(0,0,512,512);
// unbind texture
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,0);
Вот мои настройки плеера> other:
Обновление 2: Возможный конвейер, который можно попробовать: вызвать функцию рисования внешней текстуры для FBO (присоединяется к Unity texture_2d) в C ++ через этот интерфейс.
Обновление 3: При вызове функций Java из собственного кода, которые отвечают за рисование текстуры из SurfaceTexture в FBO в текстуру Unity через GL.IssuePluginEvent
, получается черная текстура, как и в первом обновлении. Он будет отображать изображения в эмуляторе, но не в Unity.