- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想在 Android 上用 native 代码进行离屏图像处理,所以我需要通过 EGL 在 native 代码中创建 openGL 上下文。
通过 EGL,我们可以创建 EGLSurface,我可以看到那里有三个选择:* EGL_WINDOW_BIT* EGL_PIXMAP_BIT* EGL_BUFFER_BIT
第一个用于屏幕上处理,第二个用于屏幕外,所以我这样使用 EGL_PIXMAP_BIT:
// Step 1 - Get the default display.
EGLDisplay eglDisplay = eglGetDisplay((EGLNativeDisplayType) 0);
if ((eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY)) == EGL_NO_DISPLAY) {
LOGH("eglGetDisplay() returned error %d", eglGetError());
exit(-1);
}
// Step 2 - Initialize EGL.
if (!eglInitialize(eglDisplay, 0, 0)) {
LOGH("eglInitialize() returned error %d", eglGetError());
exit(-1);
}
// Step 3 - Make OpenGL ES the current API.
eglBindAPI(EGL_OPENGL_ES_API);
// Step 4 - Specify the required configuration attributes.
EGLint pi32ConfigAttribs[] = { EGL_SURFACE_TYPE, EGL_PIXMAP_BIT,
EGL_BLUE_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_RED_SIZE, 8, EGL_NONE,
EGL_BIND_TO_TEXTURE_RGBA, EGL_TRUE };
// Step 5 - Find a config that matches all requirements.
int iConfigs;
EGLConfig eglConfig;
eglChooseConfig(eglDisplay, pi32ConfigAttribs, &eglConfig, 1, &iConfigs);
if (iConfigs != 1) {
LOGH(
"Error: eglChooseConfig(): config not found %d - %d.\n", eglGetError(), iConfigs);
exit(-1);
}
// Step 6 - Create a surface to draw to.
EGLSurface eglSurface = eglCreatePbufferSurface(eglDisplay, eglConfig,
NULL);
// Step 7 - Create a context.
EGLContext eglContext = eglCreateContext(eglDisplay, eglConfig, NULL,
ai32ContextAttribs);
// Step 8 - Bind the context to the current thread
eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext);
代码在第5步失败了,Android好像不支持离屏处理?不支持 EGL_PIXMAP_BIT 类型。!
最佳答案
您正在尝试使用在 Android 上不起作用的 EGL 选项,并且 pbuffers 仅在某些 GPU 上起作用——而不是 Nvidia Tegra。 pi32ConfigAttribs[]
应该看起来像这样,无论它是在屏幕上还是在屏幕外:
EGLint pi32ConfigAttribs[] =
{
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_RED_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_BLUE_SIZE, 8,
EGL_ALPHA_SIZE, 8,
EGL_DEPTH_SIZE, 0,
EGL_STENCIL_SIZE, 0,
EGL_NONE
};
Android 在支持离屏 EGLSurfaces 方面非常不灵活。他们定义了自己的名为 EGL_NATIVE_BUFFER_ANDROID
的像素图类型。
要在 Android 上创建一个屏幕外的 EGL 表面,构造一个 SurfaceTexture
并将其传递给 eglCreateWindowSurface()
。您还应该查看使用 EGL 图像扩展和 EGL_NATIVE_BUFFER_ANDROID
,如此处所述:
http://software.intel.com/en-us/articles/using-opengl-es-to-accelerate-apps-with-legacy-2d-guis
更新:下面是一些创建屏幕外表面的示例代码:
private EGL10 mEgl;
private EGLConfig[] maEGLconfigs;
private EGLDisplay mEglDisplay = null;
private EGLContext mEglContext = null;
private EGLSurface mEglSurface = null;
private EGLSurface[] maEglSurfaces = new EGLSurface[MAX_SURFACES];
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height)
{
InitializeEGL();
CreateSurfaceEGL(surfaceTexture, width, height);
}
private void InitializeEGL()
{
mEgl = (EGL10)EGLContext.getEGL();
mEglDisplay = mEgl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
if (mEglDisplay == EGL10.EGL_NO_DISPLAY)
throw new RuntimeException("Error: eglGetDisplay() Failed " + GLUtils.getEGLErrorString(mEgl.eglGetError()));
int[] version = new int[2];
if (!mEgl.eglInitialize(mEglDisplay, version))
throw new RuntimeException("Error: eglInitialize() Failed " + GLUtils.getEGLErrorString(mEgl.eglGetError()));
maEGLconfigs = new EGLConfig[1];
int[] configsCount = new int[1];
int[] configSpec = new int[]
{
EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL10.EGL_RED_SIZE, 8,
EGL10.EGL_GREEN_SIZE, 8,
EGL10.EGL_BLUE_SIZE, 8,
EGL10.EGL_ALPHA_SIZE, 8,
EGL10.EGL_DEPTH_SIZE, 0,
EGL10.EGL_STENCIL_SIZE, 0,
EGL10.EGL_NONE
};
if ((!mEgl.eglChooseConfig(mEglDisplay, configSpec, maEGLconfigs, 1, configsCount)) || (configsCount[0] == 0))
throw new IllegalArgumentException("Error: eglChooseConfig() Failed " + GLUtils.getEGLErrorString(mEgl.eglGetError()));
if (maEGLconfigs[0] == null)
throw new RuntimeException("Error: eglConfig() not Initialized");
int[] attrib_list = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL10.EGL_NONE };
mEglContext = mEgl.eglCreateContext(mEglDisplay, maEGLconfigs[0], EGL10.EGL_NO_CONTEXT, attrib_list);
}
private void CreateSurfaceEGL(SurfaceTexture surfaceTexture, int width, int height)
{
surfaceTexture.setDefaultBufferSize(width, height);
mEglSurface = mEgl.eglCreateWindowSurface(mEglDisplay, maEGLconfigs[0], surfaceTexture, null);
if (mEglSurface == null || mEglSurface == EGL10.EGL_NO_SURFACE)
{
int error = mEgl.eglGetError();
if (error == EGL10.EGL_BAD_NATIVE_WINDOW)
{
Log.e(LOG_TAG, "Error: createWindowSurface() Returned EGL_BAD_NATIVE_WINDOW.");
return;
}
throw new RuntimeException("Error: createWindowSurface() Failed " + GLUtils.getEGLErrorString(error));
}
if (!mEgl.eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext))
throw new RuntimeException("Error: eglMakeCurrent() Failed " + GLUtils.getEGLErrorString(mEgl.eglGetError()));
int[] widthResult = new int[1];
int[] heightResult = new int[1];
mEgl.eglQuerySurface(mEglDisplay, mEglSurface, EGL10.EGL_WIDTH, widthResult);
mEgl.eglQuerySurface(mEglDisplay, mEglSurface, EGL10.EGL_HEIGHT, heightResult);
Log.i(LOG_TAG, "EGL Surface Dimensions:" + widthResult[0] + " " + heightResult[0]);
}
private void DeleteSurfaceEGL(EGLSurface eglSurface)
{
if (eglSurface != EGL10.EGL_NO_SURFACE)
mEgl.eglDestroySurface(mEglDisplay, eglSurface);
}
关于Android 使用 EGL 初始化 openGL2.0 上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18529021/
我已经编译了 SDL 2.0 源代码。 首先,我在控制台上推荐了 'cmake ../-G "MinGW Makefiles"。 其次,我赞扬了“制造”。但发生错误。 fatal error: EGL
我正在用 opengl 和 java/android 做一些工作。我在 C++ 中有一些代码,并且正在使用 JNI 在两者之间进行交互。我得到结果: D/App ( 2966): eglGet
我正在尝试通过指定 eglfs 平台在没有 X Server 的情况下运行 hellogl_es2 Qt 示例: ./hellogl_es2 -platform eglfs EGL Error : C
版本情况如下 CUDA版本:10.2 tensorrt版本:8.0.1.6 JetPack版本:32.6.1 deepstream版本:6.0 官网的系统版本适配图如下: 通过对比发现:我的版本是没有
我想实现一个生成图像的opengl应用程序,并通过网页查看图像。 该应用程序旨在运行在没有显示器、没有 x 窗口但具有 gpu 的 linux 服务器上。 我知道 egl 可以使用 pixmap 或
考虑到上下文句柄从 main() 传递给线程的函数,是否允许从 main() 创建 egl 上下文并从另一个线程渲染? 最佳答案 是的,肯定是。 首先,您需要在一个线程中创建一个上下文: EGL
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 5年前关闭。 Improve thi
我正在尝试在 Ubuntu Trusty 系统上使用 g++ 4.9.1 链接一个非常简单的 GLES2 和 EGL 程序。我正在使用台面库。 我收到 EGL 函数的链接器错误: test.cpp:(
EGL 看起来是有史以来记录最差的 Khronos 项目,我确实找不到关于这个项目的任何具体信息,但它看起来很有希望,最后有一个标准化的 GLUT/FreeGlut 替代方案。 我的观点是,假设我想要
我有一个包含两个 Activity 的 Android 项目。一个是我的主要 Activity ,使用从 native 代码更新的 GLSurfaceView。另一个是 PurchaseActivit
setPreserveEGLContextOnPause Android 函数的文档说明如下: “...如果设置为 true,那么当 GLSurfaceView 暂停时,EGL 上下文可能会被保留..
对于那些处理过 EGL(精英游戏阶梯)锦标赛和阶梯脚本的人...我在弄清楚如何为我制作的自定义模组添加新的组权限时遇到了问题。我创建了一种新型的“一般规则”模组,我想存储权限,如下所示: case "
我在少数设备上遇到以下崩溃,代码在少数设备上运行良好。我不明白是哪部分代码造成了这次崩溃。几天前它工作正常,突然间我看到了这次崩溃。谁能告诉我是什么导致了这次崩溃。请帮助我 堆栈轨迹如下: java.
看起来 EGL 将成为将“GUI 窗口”连接到图形服务器的下一个最流行的标准,我的问题是:有一个 GUI 框架,可能是在 C++ 中,它能够在EGL 的顶部? 出于不同的原因,我将 GTK、QT、Wx
目前我转换 eglGetError() 结果的函数如下所示: std::string eglErrorString(EGLint error) { switch(error) {
我在 Cloudbees 上设置了一个 Jenkins Job,我可以在那里成功地 checkout 和编译我的 Android 项目。现在我想在 android 模拟器中运行一些 JUnit 测试并
在 OpenGL ES 中,我可以使用扩展名为 GL_EXT_sRGB 的 OpenGL ES 3.0 或 OpenGL ES 2.0 创建 sRGB 渲染缓冲区。我创建了一个内部格式为 GL_SRG
任何人都可以向我解释什么是 EGL 以及它的作用吗? 我如何在 Linux 上将 EGL 与 OpenGL-ES 结合使用? EGL 是硬件和操作系统之间的一层吗? 最佳答案 EGL是独立于窗口系统的
此代码在没有抗锯齿 (samples=0) 时呈现彩色三角形。但是,当我打开抗锯齿 (samples=1...32) 时,它无法呈现任何内容。如何使其与抗锯齿一起使用?也许我无法直接从多重采样 fbo
我正在尝试对我正在解决的问题进行服务器端渲染。 EGL 提供了一种无需窗口系统即可定义 OpenGL 上下文的方法。我已经能够在笔记本电脑上使用 EGL 成功地离屏渲染,但是当我尝试在 digital
我是一名优秀的程序员,十分优秀!