在Linux上,如何開發OpenGL ES(GLES)2.0應用程序?


轉載: https://ubuntuqa.com/article/7768.html

 

問題描述

我想在我的Ubuntu計算機上開發OpenGL ES 2.0應用程序。我找不到支持GLES 2.0的任何庫/仿真器。有什么建議么?

最佳回答

您可以使用POWERVR SDK在PC上模擬Opengl。您可以下載SDK here。該歸檔文件提供了將仿真庫作為文檔文件安裝的必要步驟,並包括帶有源代碼的教程和演示應用程序。

次佳回答

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://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一樣),並且如果我們刪除#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

包含幾個有趣的開源示例+窗口系統樣板(X11 + EGL)。

該構建系統支持針對ARM /Mali SoC的輕松交叉編譯,但是我尚未對此進行測試。

其中包括的關鍵組件似乎是“ OpenGL ES仿真器” http://malideveloper.arm.com/resources/tools/opengl-es-emulator/,它“將OpenGL ES 3.2 API調用映射到OpenGL API”。但這並不附帶源代碼,而只是預編譯的。

使用似乎允許的自定義企業EULA,是的,請咨詢您的律師。

已在SDK v2.4.4上測試。

第三種回答

台面supports it。如果只想限制自己使用OpenGL ES,則需要將其構建到一個單獨的目錄中,然后添加適當的包含目錄和庫目錄。

參考資料

本文由Ubuntu問答整理, 博文地址: https://ubuntuqa.com/article/7768.html,未經允許,請勿轉載。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM