http://stackoverflow.com/questions/33324753/how-to-use-unity-createexternaltexture-on-android
Can someone please help me figure out what is the problem with my code? I am trying to load an image from the native side and send the texture to Unity. I am using Unity Pro 5.0.2f1.
Unity Side:
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 Side:
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; }
So, I figured it out... The code is actually correct. except the texture format in both side should be the same. In my case, I have
TextureFormat.ARGB32
(in
unity side) and GLES20.GL_RGBA
(in
Java side) which don't match. Also somehow GLES20.glTexImage2D(...)
didn't
work for me. I replaced it with GLUtils.texImage2D(GLES20.GL_TEXTURE_2D,0,
bitmap,0);
and finally I noticed the same code works on same Unity versions and doesn't work on some other. for example it is not working in 5.0.2f1
but it works in 5.0.3.