我在 VirtualBox 上运行 Ubuntu。已安装客户机附加组件,现在操作系统具有硬件加速功能。我已安装 OpenGL 库。
现在我想使用 egl + opengles1.1 和 2.0 运行应用程序。如何在 Ubuntu 上获取它们?
有没有可用的开源库?
这些库应该使用 VirtualBox 提供的硬件加速功能。
答案1
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
,链接就会按预期失败。
致谢:亨普富特使得代码更加正确。
ARM Mali OpenGL ES SDK
- 下载自:http://malideveloper.arm.com/resources/sdks/opengl-es-sdk-for-linux/
- 在浏览器上打开文档 HTML
- 按照“快速入门指南”,很简单
包含几个有趣的开源示例+窗口系统样板(X11+EGL)。
构建系统支持 ARM / Mali SoCs 的轻松交叉编译,但我还没有测试过。
所包含的关键组件似乎是“OpenGL ES 模拟器”http://malideveloper.arm.com/resources/tools/opengl-es-emulator/它“将 OpenGL ES 3.2 API 调用映射到 OpenGL API”。但是它不附带源代码,仅预编译。
使用看似许可的定制企业 EULA,但是,请咨询您的律师。
在 SDK v2.4.4 上测试。
答案2
自从提出问题以来,出现了一个可以提供帮助的包:
sudo apt-get install libgles2-mesa-dev
答案3
您可以使用以下命令搜索包和包内容apt-cache
:
> apt-cache search opengles
mesa-utils-extra - Miscellaneous Mesa utilies (opengles, egl)
输出表明 OpenGLES 可能在包中mesa-utils-extra。 梅萨 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
。
答案4
尝试ARM OpenGL ES 2.0 模拟器,我自己还没有成功让 OpenGL ES 2.0 工作,但 1.1 似乎运行良好(simpleApp 演示)。据我所知,它应该是硬件加速的,因为模拟器使用平台GL
库,而 mesa3d(虽然不确定)是加速的。
还有libgles2-mesa
- 但不幸的是我无法让它工作。es2gears/es2tri 样本崩溃以及与 mesa libs 链接的 simpleApp 崩溃。