SurfaceTexture в плагине Android не работает в Unity

Я не могу привязать текстуру к SurfaceTexture для отображения в Unity.

Обновление 4: на основе конвейера в обновлении 1 (поверхность-> внешняя текстура с помощью текстуры поверхности -> fbo -> текстура 2d) я знаю SurfaceTexture неправильно конвертирует свою поверхность в текстуру. Я могу получить правильно нарисованные изображения с его поверхности с помощью pixelcopy, и я могу подтвердить, что мой рисунок FBO для конвейера texture 2d работает с некоторыми тестовыми цветами. Итак, вопрос в том, почему 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. Я вызываю следующий метод из Unity's OnRenderObject() сохранить всю визуализацию 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апи.

Вот мой обзорный код FBO - мой код рендеринга взят из программы Grafika texture2D:

    // 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); 

Вот мои настройки игрока> другое:

Обновление 2: возможный конвейер для попытки: вызовите функцию рисования внешней текстуры для FBO (прикрепленной к Unity's texture_2d) в C++ через этот интерфейс.

Обновление 3: вызов функций Java из нативного кода, которые отвечают за отрисовку текстуры из SurfaceTexture в FBO в текстуру Unity через GL.IssuePluginEvent произвести черную текстуру, как в первом обновлении. Он будет отображать изображения в эмуляторе, но не в Unity.

1 ответ

Мне пришлось выполнить аналогичную задачу пару месяцев назад, и я обнаружил, что правильный конвейер создает текстуру в Unity, получает собственный указатель в C и, наконец, обновляет его на уровне Java.

Пожалуйста, посмотрите на этот пример проекта, он должен дать вам другую точку зрения.

https://github.com/robsondepaula/unity-android-native-camera

С уважением

Другие вопросы по тегам