仅使用 EGLSurface 在多个表面上绘图?
Drawing on multiple surfaces by using only EGLSurface?
是否可以仅使用 eglCreateWindowSurface 返回的处理程序在多个表面上从同一个应用程序中逐一绘制?
我想要实现的是创建两个或多个表面并将它们传递给将在其上绘制的客户端,然后,完成后,基本上,我只需要执行 swapBuffers。
一个简单的表面处理程序 (EGLSurface) 就足以让客户端绘制形状等?
我找不到任何例子;每个示例都只是在当前上下文中绘制。
我从来没有尝试过这个,但应该是可以的。在 EGL 级别,当您使用 eglMakeCurrent()
调用使上下文成为当前上下文时,上下文和表面之间的关联就会建立:
EGLBoolean eglMakeCurrent( EGLDisplay display,
EGLSurface draw,
EGLSurface read,
EGLContext context);
您传递给此调用的 EGLSurface
(通常 read
和 draw
相同)可以来自 eglCreateWindowSurface()
的 return 值。
因此,如果您当前正在绘制到 surface1
,并且想要开始渲染到 surface2
,您可以使用:
eglMakeCurrent(eglGetCurrentDisplay(), surface2, surface2,
eglGetCurrentContext());
请注意,每个表面一次只能用于一个上下文。来自 EGL 1.4 规范:
at most one context may be bound to a particular surface at a given time
我会通过创建一个由纹理支持的 openGL 帧缓冲区来解决这个问题。我会为此画一次复杂的图画。然后我会使用纹理 ID 在每个 EGLSurface 上绘制一个四边形。
类似于:
eglMakeCurrent();
// generate na FB
glGenFramebuffers(1, &fb);
glBindFramebuffer(GL_FRAMEBUFFER, fb);
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, mContextParams->mTexture);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA,
GL_UNSIGNED_BYTE, NULL);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_TEXTURE_2D, Texture, 0);
然后将精美的东西绘制到帧缓冲区:
eglMakeCurrent();
glBindFramebuffer(GL_FRAMEBUFFER, fb);
// do draw here
// unbind
glBindFramebuffer(GL_FRAMEBUFFER, 0);
然后绘制到屏幕:
for (everyEGLContext)
{
eglMakeCurrent(display, surface, surface, context);
drawQuad(texture);
eqlSwapBuffers(display, surface);
}
是否可以仅使用 eglCreateWindowSurface 返回的处理程序在多个表面上从同一个应用程序中逐一绘制?
我想要实现的是创建两个或多个表面并将它们传递给将在其上绘制的客户端,然后,完成后,基本上,我只需要执行 swapBuffers。 一个简单的表面处理程序 (EGLSurface) 就足以让客户端绘制形状等?
我找不到任何例子;每个示例都只是在当前上下文中绘制。
我从来没有尝试过这个,但应该是可以的。在 EGL 级别,当您使用 eglMakeCurrent()
调用使上下文成为当前上下文时,上下文和表面之间的关联就会建立:
EGLBoolean eglMakeCurrent( EGLDisplay display,
EGLSurface draw,
EGLSurface read,
EGLContext context);
您传递给此调用的 EGLSurface
(通常 read
和 draw
相同)可以来自 eglCreateWindowSurface()
的 return 值。
因此,如果您当前正在绘制到 surface1
,并且想要开始渲染到 surface2
,您可以使用:
eglMakeCurrent(eglGetCurrentDisplay(), surface2, surface2,
eglGetCurrentContext());
请注意,每个表面一次只能用于一个上下文。来自 EGL 1.4 规范:
at most one context may be bound to a particular surface at a given time
我会通过创建一个由纹理支持的 openGL 帧缓冲区来解决这个问题。我会为此画一次复杂的图画。然后我会使用纹理 ID 在每个 EGLSurface 上绘制一个四边形。
类似于:
eglMakeCurrent();
// generate na FB
glGenFramebuffers(1, &fb);
glBindFramebuffer(GL_FRAMEBUFFER, fb);
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, mContextParams->mTexture);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA,
GL_UNSIGNED_BYTE, NULL);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_TEXTURE_2D, Texture, 0);
然后将精美的东西绘制到帧缓冲区:
eglMakeCurrent();
glBindFramebuffer(GL_FRAMEBUFFER, fb);
// do draw here
// unbind
glBindFramebuffer(GL_FRAMEBUFFER, 0);
然后绘制到屏幕:
for (everyEGLContext)
{
eglMakeCurrent(display, surface, surface, context);
drawQuad(texture);
eqlSwapBuffers(display, surface);
}