我无法将纹理绑定到 aSurfaceTexture
以在 Unity 中显示。
更新 4:基于更新 1 中的管道(表面-> 通过表面纹理的外部纹理 -> fbo -> 纹理 2d)我知道SurfaceTexture
它没有正确地将其表面转换为纹理。我可以通过pixelcopy从其表面正确绘制图片,并且可以确认我的FBO绘图到texture2d管道可以使用一些测试颜色。那么问题来了,为什么 SurfaceTexture 不能将其表面转换为纹理呢?
我在 Java 中生成 aTexture
并将其指针传递回 Unity:
public void initGLTexture()
{
Log.d("Unity", "initGLTexture");
int textures[] = new int[1];
GLES20.glGenTextures(1, textures, 0);
mTextureId = textures[0];
GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTextureId);
GLES20.glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
}
SurfaceTexture
我从 id创建一个(在 Java 中):
mSurfaceTexture = new SurfaceTexture(mTextureId);
mSurfaceTexture.setDefaultBufferSize(512, 512);
我使用第三方库GeckoView来渲染 SurfaceTexture 的 Surface。我从 Unity 调用以下方法OnRenderObject()
以将所有 GL 渲染保持在同一线程上:
mSurfaceTexture.updateTexImage();
我知道上面的代码允许在表面上正确绘制。
我在 Unity 中调用以下命令来加载纹理:
_imageTexture2D = Texture2D.CreateExternalTexture(
512,512,TextureFormat.RGBA32,false,true,(IntPtr) mTextureId);
_rawImage.texture = _imageTexture2D;
为什么RawImage
应用了纹理的只显示这个看起来像精灵的东西,应该是一个网页?
更新 1:所以我一直在研究以下假设:使用 Gecko 绘制到 Surface,并使用 SurfaceTexture 将此表面渲染为GL_TEXTURE_EXTERNAL_OES
. 由于我无法在 Unity 上显示它(不知道为什么),我将此纹理绘制到帧缓冲区并将帧缓冲区中的像素复制到GL_TEXTURE_2D
. 我在 texture_2d 中获得了一个网页(在带有 imageview 和 的模拟器中glReadPixels
)。但是,当我将工作导入 Unity 以测试到目前为止管道是否正常时,我只是得到一个黑屏。我可以通过PixelCopy
api 获取表面的图像。
这是我的 FBO 概览代码 - 我的渲染代码来自 grafika 的texture2D 程序:
// bind display buffer
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, mFrameBufferId);
GlUtil.checkGlError("glbindframebuffer");
// unbind external texture to make sure it's fresh
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, 0);
GlUtil.checkGlError("glunbindexternaltex");
// bind source texture (done in drawFrame as well )
GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, mOffscreenTextureId);
GlUtil.checkGlError("glBindFramebuffer");
// draw to frame buffer
GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // again, only really need to
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); // clear pixels outside rect
mFullScreen.drawFrame(mOffscreenTextureId, mIdentityMatrix);
// unbind source texture
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,0);
GlUtil.checkGlError("glBindTexture2d");
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, 0);
GlUtil.checkGlError("glunbindexternaltex");
// make sure we're still bound to fbo
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, mFrameBufferId);
GlUtil.checkGlError("glBindTexture2d");
// copy pixels from frame buffer to display texture
GLES20.glCopyTexImage2D(GLES20.GL_TEXTURE_2D,0,GLES20.GL_RGBA,0,0,512,512,0);
// read pixels from the display buffer to imageview for debugging
BitmapDisplay.mBitmap = SavePixels(0,0,512,512);
// unbind texture
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,0);
更新 2:可能的管道尝试:通过此接口在 C++ 中将外部纹理的绘制函数调用到 C++ 中的 FBO(附加到 Unity 的 texture_2d)。
更新 3:从本机代码调用 Java 函数,这些函数负责将纹理从 SurfaceTexture 绘制到 FBO 再到 Unity 的纹理,并GL.IssuePluginEvent
像第一次更新一样产生黑色纹理。它将在模拟器中显示图像,但在 Unity 中不显示。