Android(Java 而不是 C/C++)插件可以改变统一纹理吗?

Can an Android (Java not C/C++) plugin alter unity textures?

我正在尝试使用 Android 插件来解决 Unity 在移动设备上不支持视频纹理这一事实。我通过获取将用于视频的纹理 ID(由 Texture2D.GetNativeTextureID() 提供)来实现此目的,然后将其传递到 Java 插件。

插件然后按照标准的 MediaPlayer 实现将视频播放到表面纹理中,表面纹理已分配了上述纹理 ID。

当我调用 MediaPlayer.Start() 方法时,LogCat 输出就像媒体播放器正在工作 normally/as 希望的那样,但是纹理在应用程序中永远不会改变。我从 monobehaviour 脚本的 OnPreRender() 方法调用插件(甚至初始化它),同时确保也调用 GL.InvalidateState()

下面看一下相关代码:

构造函数:

public VideoPlayer(String _path, Context _cont) {
    m_MediaPlayer = new MediaPlayer();
    try {
        Uri uri = Uri.parse(_path);
        m_MediaPlayer.setDataSource(_cont, uri);
        m_MediaPlayer.setOnPreparedListener(this);
    }
    catch (IOException e) {
        Log.e(TAG, "Error setting data source: " + e.getMessage());
    }
}

表面纹理准备:

public void PrepareVideo(int _texPtr) {
    try {
        m_SurfTex = new SurfaceTexture(_texPtr);
        m_SurfTex.setOnFrameAvailableListener(this);
        Log.i(TAG, "Surface Texture ready");
        Surface surface = new Surface(m_SurfTex);
        m_MediaPlayer.setSurface(surface);
        Log.i(TAG, "Surface Ready");
        surface.release();
        m_Ready = true;
        m_MediaPlayer.prepare();
    }
    catch (IOException | IllegalStateException e) {
        Log.e(TAG, "Error preparing player: " + e.getMessage());
        m_Ready = false;
    }
}

我想知道我当前的设置是否可以实现这种类型的过程,还是必须考虑使用 NDK 来编写一些东西?具体来说,表面纹理可以改变 Unity 中生成的纹理吗?

虽然我没有发现任何明确说明可以做到这一点,但似乎没有真实的信息或任何以前做过的例子。

我将尝试在本机 C++ 代码中对此进行重新处理。

您是否尝试过在统一渲染线程中创建表面纹理,例如通过在扩展的 UnityPlayer 中覆盖 runglthreadsjobs?这将确保它绑定到正确的 glcontext AFAIK。

我尝试过共享上下文,但由于文档稀少且 unity 非常封闭,所以无法正常工作。

在 unity 4.2 中显然更容易。