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 中显然更容易。
我正在尝试使用 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 中显然更容易。