Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android eglMakeCurrent用于仅渲染为FBO的上下文的哪个曲面_Android_C++_Ios_Opengl Es 2.0_Egl - Fatal编程技术网

Android eglMakeCurrent用于仅渲染为FBO的上下文的哪个曲面

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

我的情况如下:

在iOS和Android的跨平台渲染库(用c++编写)中,我有两个线程,每个线程都需要自己的EGLContext: 线程A是主线程;它将渲染到窗口。 线程B是一个生成器线程,它执行各种计算,并将结果渲染为线程a稍后使用的纹理

因为我不能在iOS上使用EGL,所以库使用指向静态Obj.-C函数的函数指针来创建新上下文并将其设置为当前。 这已经起作用了,我使用

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中想要做的
我不明白Munshi、Ginsurg和Shreiner所说的这句话是什么意思,一个帧缓冲区对象如何取代pbuffer曲面?如果我创建一个非常小(比如1x1px)的pbuffer曲面以使上下文成为当前上下文,那么我仍然可以渲染成任意大的FBO吗?还有其他我还不知道的可能性吗


非常感谢你的帮助

传递给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创建屏幕外上下文,首先需要有可用的屏幕上下文。对吗?