有人可以帮我弄清楚我的代码有什么问题吗?我正在尝试从本机端加载图像并将纹理发送到Unity。我使用的是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;
}
答案 0 :(得分:4)
所以,我想出来了......代码实际上是正确的。除了两边的纹理格式应该相同。
就我而言,我有TextureFormat.ARGB32
(在统一方面)和GLES20.GL_RGBA
(在Java方面)不匹配。不知怎的GLES20.glTexImage2D(...)
对我来说也不起作用。我换了它
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D,0, bitmap,0);
最后我注意到相同的代码适用于相同的Unity版本,而不适用于其他版本。例如,它在5.0.2f1中不起作用,但它在5.0.3中有效。
答案 1 :(得分:1)
除了确保Unity和本机插件都期望相同的图像格式之外,我遇到的一个问题是在CPU线程上创建纹理失败,因为线程无法访问opengl context。
我对此问题的解决方案是使用Unity的GL.IssuePluginEvent在渲染线程上创建纹理。