如何在Linux上开发OpenGL ES(GLES)2.0应用程序?

我想在我的Ubuntu机器上开发OpenGL ES 2.0应用程序。 我找不到任何支持GLES 2.0的库/模拟器。 有什么build议么?

Solutions Collecting From Web of "如何在Linux上开发OpenGL ES(GLES)2.0应用程序?"

您可以使用POWERVR SDK在PC上模拟Opengl es。 你可以在这里下载SDK。 归档文件提供了将仿真库作为文档文件安装的必要步骤,并包括带有源代码的教程和演示应用程序。

GLFW,Mesa,Ubuntu 16.04 AMD64

这在Ubuntu 14.04上安装起来并不容易,但是现在只是起作用。

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 : GLFW_INCLUDE_ES2 ,并快速查看源代码显示它转发给GLES:

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

这个源代码似乎是写在GLES和OpenGL的通用子集中(就像GLES的很多部分一样),如果我们删除了#define GLFW_INCLUDE_ES2 ,也用-lGL编译。

如果我们添加不像GLES中那样的东西,就像立即呈现glBegin ,链接将按预期失败。

另请参阅: https : //askubuntu.com/questions/244133/how-do-i-get-egl-and-opengles-libraries-for-ubuntu-running-on-virtualbox

积分: 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 3.2 API调用映射到OpenGL API”的“OpenGL ES仿真器” http://malideveloper.arm.com/resources/tools/opengl-es-emulator/ 。 但是,这不包含源代码,只有预编译。

使用自定义企业EULA似乎是宽容的,但是,请问你的律师。

在SDK v2.4.4上测试

梅萨支持它 。 如果你只想限制自己的OpenGL ES,那么你需要将它建立到一个单独的目录,然后添加适当的包含和库目录。

开发到OpenGL 2.0标准 ,不要使用即时模式或固定功能模式。 本质上你的程序将符合ES 2.0标准。

你可以生成一个只有你真正需要的函数的头文件。 用glfw你可以创建一个opengl上下文。 所以你不能意外地使用你不想使用的函数,因为它们不会被这样定义。 我发现这可能会帮助你。

从非官方的opengl sdk负载