Android eglMakeCurrent用于仅渲染为FBO的上下文的哪个曲面
我的情况如下: 在iOS和Android的跨平台渲染库(用c++编写)中,我有两个线程,每个线程都需要自己的EGLContext: 线程A是主线程;它将渲染到窗口。 线程B是一个生成器线程,它执行各种计算,并将结果渲染为线程a稍后使用的纹理 因为我不能在iOS上使用EGL,所以库使用指向静态Obj.-C函数的函数指针来创建新上下文并将其设置为当前。 这已经起作用了,我使用Android eglMakeCurrent用于仅渲染为FBO的上下文的哪个曲面,android,c++,ios,opengl-es-2.0,egl,Android,C++,Ios,Opengl Es 2.0,Egl,我的情况如下: 在iOS和Android的跨平台渲染库(用c++编写)中,我有两个线程,每个线程都需要自己的EGLContext: 线程A是主线程;它将渲染到窗口。 线程B是一个生成器线程,它执行各种计算,并将结果渲染为线程a稍后使用的纹理 因为我不能在iOS上使用EGL,所以库使用指向静态Obj.-C函数的函数指针来创建新上下文并将其设置为当前。 这已经起作用了,我使用 EAGLContext *contextA = [[EAGLContext alloc] initWithAPI:kEAGL
EAGLContext *contextA = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
线程B的上下文是使用
EAGLContext *contextB = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2 sharegroup:[contextA sharegroup]];
然后,我可以设置两个电流:
[EAGLContext setCurrentContext:context];
为了在Android上使用相同的逻辑(传递到库中的函数指针),我想在JNI绑定的C端执行此操作,这次使用real EGL而不是Apple的EAGL。
我可以使用WindowsSurface和本机窗口轻松创建contextA,我可以创建contextB并将contextA传递给eglCreateContext调用的shareContext参数
但是当我想让contextB成为当前的时候,我必须把一个曲面传递给eglMakeCurrent调用,我试图弄清楚应该传递什么样的曲面
- 我不能使用我用于contextA的WindowsSurface,正如第3.7节中所说的“在给定时间,每个受支持的客户端API的最多一个上下文可能是特定线程的当前上下文,并且在给定时间,最多一个上下文可能绑定到特定曲面。”
- 我不能指定EGL_NO_SURFACE,因为这将导致eglMakeCurrent调用中出现EGL_BAD_匹配错误
- 看起来我可以使用PBuffer曲面,但我犹豫了,因为在创建这样的曲面时,我必须指定宽度和高度,线程B可能需要创建不同大小的纹理。除此之外,Munshi、Ginsburg和Shreiner在第3.8节中指出,“Pbuffers最常用于生成纹理贴图。如果您只想渲染到纹理,我们建议使用帧缓冲区对象[…]而不是Pbuffers,因为它们效率更高”,这正是我在线程B中想要做的
非常感谢你的帮助 传递给eglMakeCurrent()的曲面必须是来自EGLCreateWindowsSurface()的EGL曲面。例如:
EGLSurface EglSurface = mEgl.eglCreateWindowSurface(mEglDisplay, maEGLconfigs[0], surfaceTexture, null);
mEgl.eglMakeCurrent(mEglDisplay, EglSurface, EglSurface, mEglContext);
但是,EGLCreateWindowsSurface()需要一个SurfaceTexture,该SurfaceTexture在创建TextureView时提供给onSurfaceTextureAvailable()回调,但您也可以创建屏幕外的SurfaceTexture,而无需任何视图
这里有一个示例应用程序使用Android SDK中的TextureView,尽管它使用SurfaceTexture进行相机视频而不是OpenGL ES渲染:
sources\android-17\com\android\test\hwui\GLTextureViewActivity.java
默认情况下,FBO的EGL曲面的大小将与从中创建它们的SurfaceTexture的大小相同。可以使用以下方法更改SurfaceTexture的大小:
surfaceTexture.setDefaultBufferSize(width, height);
不要在Android上使用PBuffer,因为某些平台(Nvidia Tegra)不支持它们。
本文详细解释了固定基地运营商相对于固定基地运营商的优势:
我最终使用了一个PBuffer曲面(大小为1x1)-然后我创建了一个FBO并渲染成纹理。为了显示它们(在不同的线程和不同的(共享的)opengl上下文中),我使用带有ANativeWindow的windowsurface(sdk中的某个地方有一个示例)。如果您只想绘制FBO,您可以获取您或其他人(例如GLSurfaceView)已经创建的任何EGLContext让它成为当前的,然后你只需要生成你的FBO,然后用它画图。 问题是如何将GLSOLVIEW创建的上下文共享到跨平台C++库。我通过调用C++内部的静态函数来获得java上下文中的上下文之后立即获得EGLVIEW和Surm。如下面的代码所示:
//This is a GLSurfaceView renderer method
@override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
//up to this point, we know the EGLContext
//has already been set current on this thread.
//call JNI function to setup context
graphics_library_setup_context();
}
<> C++对应项
void setup_context() {
context = eglGetCurrentContext();
display = eglGetCurrentDisplay();
surface = eglGetCurrentSurface(EGL_DRAW);
}
你能解释一下如何在没有任何视图的情况下创建屏幕外的SurfaceTexture吗?我知道这是一个宽泛的问题,但只要几点提示就足够了;mSurfaceTexture.setDefaultBufferSize(miMaxWidth,miMaxHeight);这可以从本机代码中完成吗?我试图使用SurfaceTexture(包括frameworks/native/include/gui/SurfaceTexture.h中的标题),但仍然得到一个编译错误:在此范围内找不到SurfaceTexture的声明。可能没有。您应该在Java中构造SurfaceTexture,并将其传递给Java中的EGLCreateWindowsSurface()。可以将其中的EGL曲面(和上下文)传递到本机代码并在其中使用。@ClayMontgomery创建SurfacetTexture需要在预先存在的上下文(由glGenTextures()生成)上使用有效的GL纹理名称。这基本上意味着,要按照您建议的方式使用SurfaceTexture创建屏幕外上下文,首先需要有可用的屏幕上下文。对吗?