在 Android NDK 上创建映射/直接 OpenGL ES 纹理
Creating a Mapped/Direct OpenGL ES Texture on Android NDK
我正在开发一个需要访问OpenGL ES 2.0纹理像素的Android NDK应用程序。
OpenGL扩展允许按照此处,此处和此处所述执行此操作。
所有这些方法都需要使用不属于 NDK 的 GraphicBuffer
类(例如,请参阅此处(。显然,这需要访问私有C++Android API(来自AOSP-Android开源项目(。
首先,如果我实际构建并链接到 AOSP 存储库,我的应用程序是否会在与"纯"NDK 版本相同的 Android 设备上运行?
任何人都可以提供(参考(有关如何执行此操作以及执行此操作的利弊的详细说明吗?
其次,Android的"图形架构"文档指出:
分析窗口
公共 Surface 类在 Java 编程中实现 语言。C/C++ 中的等效项是 ANativeWindow 类, 由Android NDK半暴露。您可以从 使用 ANativeWindow_fromSurface(( 调用的图面。就像它一样 Java语言表亲,你可以锁定它,在软件中渲染,以及 解锁并发布。
若要从本机代码创建 EGL 窗口图面,请传递一个实例 的EGLNativeWindowType to eglCreateWindowSurface((。 EGLNativeWindowType 只是 ANativeWindow 的同义词,所以你可以 自由地将一个投射到另一个。
根据这个GraphicBuffer
是ANativeWindowBuffer
上的"简单包装器"。
所以第二个问题是:是否可以仅使用 EGL 和 NDK 函数(不需要 AOSP(来创建像 GraphicBuffer
这样的 OpenGL 纹理兼容表面?如果是这样,怎么办?
从你的第二个问题开始,我认为没有。如果只想将代码保留在本机端,则必须使用 GraphicBuffers。公开这样的功能会很棒(iOS 有核心视频像素缓冲区(,但我怀疑它永远不会发生。
您实际上不需要构建AOSP来使用GraphicBuffers。只需获取一些定义结构的标头,并在代码中使用它们。然后使用 dlopen()
和 dlsym()
获取指向所需函数的指针,并使用它们。正如您的最后一个链接所指出的,请检查system/core/include/system/window.h
并frameworks/native/include/ui/GraphicBuffer.h
损坏的函数名称使代码编写起来很痛苦,但它有效。在 Firefox 源代码中有一个很好的使用示例。
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 了解 GLM- openGL 中的相机转换
- 如何在全屏模式下(在OpenGL中)使背景透明
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- OpenGL大的3D纹理(>2GB)非常慢
- OpenGl glm rotate
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- OpenGL在启用深度测试时不会丢弃我的碎片
- OpenGL相机和相机空间转型的困惑
- 公开最直接的基类模板名称
- OpenGL将纹理四边形渲染为(0,0)
- OpenGL 和 GLM 矩阵无法正确扩展,总是按比例缩小
- 发布旋转矩阵(openGL/glm)
- OpenGL 4.5 直接状态访问呈现三角形 - GL_INVALID_VALUE
- OpenGL:用点和直接向量画线
- OPENGL Texture2D 直接或间接操作
- 在 Android NDK 上创建映射/直接 OpenGL ES 纹理
- 如何通过 OpenGL 缓冲区将 glm 数据类型直接传递给 GPU