OpenGL ES源文件

时间:2011-12-17 20:51:21

标签: android opengl-es

我正在尝试从android源码(libGLESv2.so)构建OpenGL SO lib,我想更多地了解Android OpenGL ES的内部机制和流程。

请纠正我错在哪里: 我知道在windows中一个开发人员包含gl.h和静态链接到OpenGL32(64).lib(它反过来动态链接到OpenGL32.dll(可能有一种方法可以由开发人员动态链接到OpenGL32.dll但不是重要)。 开发人员接触OpenGL API的声明,但我假设它依赖于HW。

同样的情况,Android:假设开发人员导入.opengl.GLES20并调用以下方法:GLES20.glTexEnvf(.... 我想知道android中幕后发生的事情(对于Android初学者来说,Linux可能更好)。 驻留在opengl / java / android / opengl / GLES20.java源代码中的实现调用本机C函数glTexEnvf,与windows不同,我们将它的实现驻留在opengl / libagl中。

这是真的吗? 在任何情况下/ libs / GLES20_dbg中的GLES2_dbg库是什么?我可以看到有一些python脚本的调试实现......它们是否可以编译OpenGL调试版? / libs / GLES20中的.in文件和gl2.cpp文件是什么? 硬件调用在哪里?当我在xperia arc中看到libGLESv2_adreno200.so时,每个GPU供应商都会发送他的libGLESv2实现进行硬件调用吗?

请帮助我理解这个流程。如果你有一个解释这个结构的链接,即使在Linux中它也会很棒。

2 个答案:

答案 0 :(得分:3)

在Windows中,opengl32.dll包含一个软件光栅化器后备和所谓的trampolines进入带有GPU驱动程序的OpenGL-ICD。

opengl32.lib实际上不是一个库,而是链接器的交叉引用,用于在可执行文件中添加条目,使操作系统在运行时动态地将程序链接到DLL。

在Linux的当前实现中,libGL.so附带了图形驱动程序,并包含供应商特定的实现。 * nix系统中使用的链接器不依赖于额外的交叉引用.lib,但可以直接从.so获取信息

在Android上,你看到的libGLES只是一种占位符,可以实现链接。但最终GPU供应商提供了适当的库,它落入虚假libGLES所在的位置。

.in文件没什么特别的。它们是配置和构建系统用于从模板(.in文件)构建源文件的输入文件,其中的字段由配置值填充。

答案 1 :(得分:1)

感谢快速回答,我做了一点挖掘,正如我在这里看到的那样: Missing OpenGL drivers on Android emulator, 进一步解释。

我现在理解的是libagl是纯SW实现。

在这种情况下,libhgl实际上是GPU供应商实现。

我也明白libEGL打开(在代码中找到它 - Loader.cpp)libGLESv2 .... 所以我会问另外两个问题:

  1. libGLESv2只能动态链接到HW lib或者libEGL会这样做吗? (在EGL上找到了一些东西 - loader.cpp,似乎动态链接了OpenGL API)
  2. 2.所以当我调用OpenGL API时,我会通过libEGL(因为有动态绑定)?从那里到libGLESv2?

    非常感谢你的帮助 它现在开始变得有意义了