如何在VirtualBox上运行Ubuntu获取EGL和OpenGLES库?

我在VirtualBox上运行Ubuntu。 安装了客户添加,现在操作系统具有硬件加速function。 我有OpenGL库。

现在我想使用egl + opengles1.1和2.0运行应用程序。 我如何在Ubuntu上获得它们?

有没有可用的开源库?

这些库应该使用VirtualBox提供的硬件加速function。

GLFW,Mesa,Ubuntu 16.04 AMD64

我没有在Virtual Box中尝试过,但是这应该可以工作,因为Mesa有一个软件实现。

sudo apt-get install libglfw3-dev libgles2-mesa-dev gcc glfw_triangle.c -lGLESv2 -lglfw 

输出:

资源:

 #include  #include  #define GLFW_INCLUDE_ES2 #include  static const GLuint WIDTH = 800; static const GLuint HEIGHT = 600; static const GLchar* vertex_shader_source = "#version 100\n" "attribute vec3 position;\n" "void main() {\n" " gl_Position = vec4(position, 1.0);\n" "}\n"; static const GLchar* fragment_shader_source = "#version 100\n" "void main() {\n" " gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n" "}\n"; static const GLfloat vertices[] = { 0.0f, 0.5f, 0.0f, 0.5f, -0.5f, 0.0f, -0.5f, -0.5f, 0.0f, }; GLint common_get_shader_program(const char *vertex_shader_source, const char *fragment_shader_source) { enum Consts {INFOLOG_LEN = 512}; GLchar infoLog[INFOLOG_LEN]; GLint fragment_shader; GLint shader_program; GLint success; GLint vertex_shader; /* Vertex shader */ vertex_shader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertex_shader, 1, &vertex_shader_source, NULL); glCompileShader(vertex_shader); glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(vertex_shader, INFOLOG_LEN, NULL, infoLog); printf("ERROR::SHADER::VERTEX::COMPILATION_FAILED\n%s\n", infoLog); } /* Fragment shader */ fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragment_shader, 1, &fragment_shader_source, NULL); glCompileShader(fragment_shader); glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(fragment_shader, INFOLOG_LEN, NULL, infoLog); printf("ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n%s\n", infoLog); } /* Link shaders */ shader_program = glCreateProgram(); glAttachShader(shader_program, vertex_shader); glAttachShader(shader_program, fragment_shader); glLinkProgram(shader_program); glGetProgramiv(shader_program, GL_LINK_STATUS, &success); if (!success) { glGetProgramInfoLog(shader_program, INFOLOG_LEN, NULL, infoLog); printf("ERROR::SHADER::PROGRAM::LINKING_FAILED\n%s\n", infoLog); } glDeleteShader(vertex_shader); glDeleteShader(fragment_shader); return shader_program; } int main(void) { GLuint shader_program, vbo; GLint pos; GLFWwindow* window; glfwInit(); glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); window = glfwCreateWindow(WIDTH, HEIGHT, __FILE__, NULL, NULL); glfwMakeContextCurrent(window); printf("GL_VERSION : %s\n", glGetString(GL_VERSION) ); printf("GL_RENDERER : %s\n", glGetString(GL_RENDERER) ); shader_program = common_get_shader_program(vertex_shader_source, fragment_shader_source); pos = glGetAttribLocation(shader_program, "position"); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glViewport(0, 0, WIDTH, HEIGHT); glGenBuffers(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); glVertexAttribPointer(pos, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0); glEnableVertexAttribArray(pos); glBindBuffer(GL_ARRAY_BUFFER, 0); while (!glfwWindowShouldClose(window)) { glfwPollEvents(); glClear(GL_COLOR_BUFFER_BIT); glUseProgram(shader_program); glDrawArrays(GL_TRIANGLES, 0, 3); glfwSwapBuffers(window); } glDeleteBuffers(1, &vbo); glfwTerminate(); return EXIT_SUCCESS; } 

关键的代码行是:

 #define GLFW_INCLUDE_ES2 #include  

GLFW_INCLUDE_ES2记录在以下url : http : GLFW_INCLUDE_ES2 ,快速查看来源显示它转发给GLES:

  #elif defined(GLFW_INCLUDE_ES2) #include  #if defined(GLFW_INCLUDE_GLEXT) #include  #endif 

这个源似乎是GLES和OpenGL的常见子集(与GLES的大部分相似),如果我们删除#define GLFW_INCLUDE_ES2 ,也会使用-lGL编译。

如果我们添加不像GLES那样立即渲染glBegin ,链接会按预期失败。

另见: https : //stackoverflow.com/questions/3809236/how-to-develop-opengl-es-gles-2-0-applications-on-linux/39356268#39356268

致谢: genpfult使代码更加正确。

ARM Mali OpenGL ES SDK

  • 下载地址: http : //malideveloper.arm.com/resources/sdks/opengl-es-sdk-for-linux/
  • 在浏览器上打开文档HTML
  • 按照“快速入门指南”,它很简单

包含几个有趣的开源示例+窗口系统样板(X11 + EGL)。

构建系统支持ARM / Mali SoC的简单交叉编译,但我还没有测试过。

包含的关键组件似乎是“OpenGL ES Emulator” http://malideveloper.arm.com/resources/tools/opengl-es-emulator/ ,它“将OpenGL ES 3.2 API调用映射到OpenGL API”。 但是这并没有附带源代码,只有预编译。

使用看似宽容的定制企业EULA,但是,请问你的律师。

在SDK v2.4.4上测试。

您可以使用apt-cache搜索包和包内容:

 > apt-cache search opengles mesa-utils-extra - Miscellaneous Mesa utilies (opengles, egl) 

输出说OpenGLES可能在mesa-utils-extra包中。 Mesa 3D有一个OpenGLES项目页面并在那里写道:

Mesa实现了OpenGL ES 1.1和OpenGL ES 2.0。 有关OpenGL ES的更多信息, 请访问http://www.khronos.org/opengles/ 。

EGL也内置于Mesa中:

 > apt-cache search mesa | grep -i egl mesa-utils-extra - Miscellaneous Mesa utilies (opengles, egl) libegl1-mesa - free implementation of the EGL API -- runtime libegl1-mesa-dbg - free implementation of the EGL API -- debugging symbols libegl1-mesa-dev - free implementation of the EGL API -- development files libegl1-mesa-drivers - free implementation of the EGL API -- hardware drivers libegl1-mesa-drivers-dbg - free implementation of the EGL API -- driver debugging symbols 

所以你需要安装mesa-utils-extra ,也许还需要安装libegl1-mesa

既然问了这个问题,就出现了一个包,可能会有所帮助:

 sudo apt-get install libgles2-mesa-dev 

试试ARM OpenGL ES 2.0 Emulator ,我自己还没有设法使OpenGL ES 2.0工作,但1.1似乎运行良好(simpleApp演示)。 据我所知,它应该是硬件加速,因为模拟器使用平台GL库,mesa3d(不确定)加速。

还有libgles2-mesa – 但不幸的是我无法使它工作。 es2gears / es2tri样本崩溃以及与mesa libs链接的simpleApp。