我正在尝试做什么:
- 使用 Java 插件从手机上的 SD 卡中提取图像。
- Unity 将纹理 ID 传递给插件。
- 插件使用opengl通过ID将图像分配给Unity中的纹理。
- (最终)将用于在 Unity 中播放手机中的视频剪辑,目前,它只是尝试更改 Unity 之外的纹理。
我的问题:
当我调用插件中的方法并将texture.GetNativeTextureID()
传递给它时,纹理不会改变。我目前仅使用简单的黑色 50x50 纹理进行测试,原始纹理是纯白色。
我担心我错过了一些重要的事情,因为这是我第一次在 java 中使用 Gl 调用。类似问题的许多答案都涉及使用 native C++ 而不是 Java,但我找不到具体的答案说必须使用 C++。我想尽力避免为 C++ 编写另一组插件和插件处理程序,但如果这是最有效/唯一的方法来实现此目的,我会这样做,因为我对 OpenGL 和 C++ 并不陌生
代码:
插件方法是从附加到主相机的脚本中的OnPreRender()
调用的:
if (grabTex) {
int texPtr = m_VideoTex.GetNativeTextureID();
Debug.Log( "texPtr = " + texPtr );
m_JVInterface.SetTex( texPtr );
}
m_VideoTex
是一个基本的 Texture2D( 50, 50 )
,所有像素设置为白色,附加到场景中四边形上的漫反射着色器。
Java插件代码如下:
public void SetTexture(Context cont, int _texPointer) {
if (_texPointer != 0) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = false;
options.inJustDecodeBounds = false;
final Bitmap bitmap = BitmapFactory.decodeFile("/storage/emulated/0/Pictures/black.jpg", options);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, _texPointer);
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
Log.i("VideoHandler", "Recieved ID: " + _texPointer);
bitmap.recycle();
}
}
最佳答案
这很可能是 OpenGL 上下文的问题。最简单的方法是将纹理作为原始字节发送到 Unity,然后在 Unity 中作为纹理上传。
关于java - 尝试从 Unity 4.6 中的 Java 插件设置纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30642503/