zoukankan      html  css  js  c++  java
  • How to use unity CreateExternalTexture on Android?

    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.
  • 相关阅读:
    Scala编程基础
    大数据学习环境搭建(CentOS6.9+Hadoop2.7.3+Hive1.2.1+Hbase1.3.1+Spark2.1.1)
    hadoop2.7.3编译,支持snappy、bzip2本地压缩
    ABAP非Unicode系统中字符串拼接(CONCATENATE)时吃字符问题
    Hadoop学习笔记
    HIVE开发总结
    中文字符截取乱码问题
    替换空字符NULL(字符编码为0的字符)
    Generate Time Data(普通日期主数据)
    Generate Time Data(财务日期主数据)
  • 原文地址:https://www.cnblogs.com/nafio/p/9137163.html