如何在 Android 上使用 Unity 的 CreateExternalTexture?

4

请问能否帮我找出我的代码问题在哪里?我在尝试从本地端加载图片,并将纹理发送到Unity。我正在使用Unity Pro 5.0.2f1。

Unity端:

void Start () {
AndroidJavaObject mImageLoader = new AndroidJavaObject("com.saeid.android.LoadTexture2D");
Texture2D texture2D = new Texture2D(1920, 1080, TextureFormat.ARGB32, false);

Int32 texPtr = mImageLoader.Call <Int32> ("loadImageReturnTexturePtr", "/storage/sdcard0/Images/test.jpg");
Debug.Log("texture pointer? " + texPtr);
Texture2D nativeTexture = Texture2D.CreateExternalTexture (1920, 1080, TextureFormat.ARGB32 , false, false, (IntPtr)texPtr);
texture2D.UpdateExternalTexture(nativeTexture.GetNativeTexturePtr());
gameObject.GetComponent<Renderer>().material.mainTexture = texture2D;
}

Java端:

public int loadImageReturnTexturePtr(String imagePath) {
Log.d(LOGTAG, "loading image1: " + imagePath);

Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
Log.d(LOGTAG, "Bitmap is: " + bitmap);

ByteBuffer buffer = ByteBuffer.allocate(bitmap.getByteCount());
bitmap.copyPixelsToBuffer(buffer);

int textures[] = new int[1];
GLES20.glGenTextures(1, textures, 0);
int textureId = textures[0];

GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId);
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 1920, 1080, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, buffer);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S,
GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,
GLES20.GL_CLAMP_TO_EDGE);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);
Log.d(LOGTAG, "texture id returned: " + textureId);

return textureId;
} 
2个回答

4
所以,我弄清楚了……代码实际上是正确的,只是两边的纹理格式应该相同。在我的情况下,我在Unity端有TextureFormat.ARGB32,在Java端有GLES20.GL_RGBA,它们不匹配。另外,一些GLES20.glTexImage2D(...)并没有起作用。我用GLUtils.texImage2D(GLES20.GL_TEXTURE_2D,0, bitmap,0);替换了它,最后我发现相同的代码可以在同一个Unity版本上运行,但在其他版本上无法运行。例如,在5.0.2f1中无法工作,但在5.0.3中可以工作。

2

除了确保Unity和本地插件期望相同的图像格式外,我遇到的一个问题是,在CPU线程上创建纹理会失败,因为该线程无法访问opengl上下文。

我的解决方案是,在渲染线程上使用Unity的GL.IssuePluginEvent来创建纹理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接