Как получить библиотеки EGL и OpenGLES для Ubuntu, запущенных на VirtualBox?

У меня работает Ubuntu на VirtualBox. Добавлены гостевые дополнения, и теперь ОС поддерживает аппаратное ускорение. У меня есть библиотека OpenGL.

Теперь я хочу запускать приложения, используя egl + opengles1.1 & 2.0. Как я могу получить их на Ubuntu?

Существуют ли библиотеки с открытым исходным кодом?

Библиотеки должны использовать возможности аппаратного ускорения, предоставляемые VirtualBox.

Вы можете искать пакеты и содержимое пакета с помощью 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 .

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 <stdio.h> #include <stdlib.h> #define GLFW_INCLUDE_ES2 #include <GLFW/glfw3.h> 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/glfw3.h> 

GLFW_INCLUDE_ES2 документируется по адресу: http://www.glfw.org/docs/latest/build_guide.html#build_macros, и быстрый просмотр источника показывает, что он пересылается в GLES:

  #elif defined(GLFW_INCLUDE_ES2) #include <GLES2/gl2.h> #if defined(GLFW_INCLUDE_GLEXT) #include <GLES2/gl2ext.h> #endif 

Этот источник, похоже, находится в общем подмножестве GLES и OpenGL (как и большинство GLES), а также компилируется с -lGL если мы удалим #define GLFW_INCLUDE_ES2 .

Если мы добавим вещи, которые не входят в 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

Содержит несколько интересных примеров с открытым исходным кодом + системный шаблон окна (X11 + EGL).

Система сборки поддерживает легкую кросс-компиляцию для ARM / Mali SoCs, но я еще не тестировал ее.

Ключевым компонентом, включенным, является «эмулятор OpenGL ES» http://malideveloper.arm.com/resources/tools/opengl-es-emulator/, который «отображает вызовы API OpenGL ES 3.2 API OpenGL». Но это не поставляется с исходным кодом, только предварительно скомпилированным.

Использует пользовательское предприятие EULA, которое представляется разрешительным, но да, спросите своего адвоката.

Протестировано на SDK v2.4.4.

Поскольку вопрос задан, появился пакет и может помочь:

 sudo apt-get install libgles2-mesa-dev 

Попробуйте ARM OpenGL ES 2.0 Emulator , мне самому не удалось заставить OpenGL ES 2.0 работать, но 1.1, похоже, работает нормально (simpleApp demo). Насколько я понимаю, это должно быть аппаратное ускорение, так как эмулятор использует библиотеки GL платформы, и mesa3d (хотя и не уверен, хотя) ускоряется.

Там также libgles2-mesa – но, к сожалению, я не мог заставить его работать. es2gears / es2tri, а также simpleApp, связанный с mesa libs.