Android 从SurfaceTexture获取OpenGL纹理句柄

Android 从SurfaceTexture获取OpenGL纹理句柄,android,opengl-es,android-camera,Android,Opengl Es,Android Camera,SurfaceTexture有一种设置纹理控制柄的方法。 似乎没有办法获得纹理句柄,除非您可以控制可能设置它的代码 我正在尝试将基础GL_纹理\u外部纹理\u OES纹理复制到RGB GL_纹理\u 2D,为此,我需要知道纹理Id。否则,我必须在TextureView上调用GetBitmap,它最终对CPU执行GPU操作,然后返回GPU复制,如果我可以直接在OpenGL中复制,这应该是可以避免的。您需要通过调用glGenTextures()在OpenGL ES上下文中创建纹理名称,然后调用Su

SurfaceTexture有一种设置纹理控制柄的方法。

似乎没有办法获得纹理句柄,除非您可以控制可能设置它的代码


我正在尝试将基础GL_纹理\u外部纹理\u OES纹理复制到RGB GL_纹理\u 2D,为此,我需要知道纹理Id。否则,我必须在TextureView上调用GetBitmap,它最终对CPU执行GPU操作,然后返回GPU复制,如果我可以直接在OpenGL中复制,这应该是可以避免的。

您需要通过调用
glGenTextures()
在OpenGL ES上下文中创建纹理名称,然后调用
SurfaceTexture.attachToGLContext(int-texName)
将外部图像绑定到该纹理名称


脚注:完成后,可以通过使用外部采样器在着色器中天真地使用SurfaceTexture。对于大多数一次性使用的算法来说,不会将其转换为新的纹理-这是对带宽和能量的浪费。

其他一些东西已经提前设置了纹理。覆盖其他进程可能设置的内容(即WebRTC)安全吗?它可能持有身份证,我可能打破了一些假设。我也无法释放原始纹理句柄,因此我们可能会泄漏纹理。没有getter是故意的吗?似乎他们正在努力保护SurfaceTexture,除非我将其传递给其他Android View类或自己生成纹理ID,否则无法在OpenGL级别上使用它。不知道WebRTC如何使用该资源,抱歉。当然,如果WebRTC同时使用它,听起来可能有风险……我想解决方案是找出WebRTC正在使用的纹理id(如果可能的话)。这就是为什么我希望在SurfaceTexture对象本身上有一个getter。这在Google文档中没有很好的记录,但事实上这是正确的做法。我对GL_纹理_外部_OES有了更好的理解。你没有写入权限。深入研究这些文章有助于我更好地理解这一点。Android允许您渲染到可以与SurfaceTexture关联的曲面。此曲面可以设置为当前EGLSurface。之后,如果您在正确的时间执行此操作,则可以将SurfaceTexture附加到您的上下文并从中读取。字符用完:基本上,一些OpenGL上下文会写入由SurfaceTexture支持的曲面。或者将摄影机连接到SurfaceTexture。然后您可以拥有自己的任意OpenGL上下文。每次阅读时,您都会使用GL_TEXTURE_EXTERNAL_OES目标生成自己的textureId,并将其传递到attachToGLContext。然后你分开。这必须正确同步,以便在写入内容时不尝试读取。哦,SurfaceTexture也可以是EGL曲面,而不是曲面。