GNU/Linux >> Tutoriels Linux >  >> Linux

Comment développer des applications OpenGL ES (GLES) 2.0 sous Linux ?

Mesa le prend en charge. Si vous souhaitez vous limiter à OpenGL ES uniquement vous devrez alors le créer dans un répertoire séparé, puis ajouter les répertoires d'inclusion et de bibliothèque appropriés.


Mise à jour :

Vous pouvez (toujours) utiliser le SDK PowerVR et maintenant il prend également en charge Vulkan. Liens mis à jour :

  • Page SDK PowerVR :https://www.imgtec.com/developers/powervr-sdk-tools/powervr-sdk/
  • Page de téléchargement des programmes d'installation :https://www.imgtec.com/developers/powervr-sdk-tools/installers/
  • Dépôt Github :https://github.com/powervr-graphics/Native_SDK

Au moment de ma réponse initiale, PowerVR SDK était la solution la plus complète (Mesa a obtenu une prise en charge complète d'OpenGL ES 2.0 avec sa version 3.1 selon sa page Wikipedia).

Désormais, Mesa et Mali SDK peuvent également être un choix. Pour des informations détaillées sur ceux-ci, veuillez vous référer à cette réponse détaillée de Ciro Santilli 冠状病毒审查六四事件法轮功

Réponse originale :

Vous pouvez utiliser POWERVR SDK pour émuler Opengl es sur votre PC. Vous pouvez télécharger le SDK ici. L'archive fournit les étapes nécessaires pour installer les bibliothèques d'émulation sous forme de fichier de documentation et comprend des didacticiels et des applications de démonstration avec les codes sources.


GLFW, Mesa, Ubuntu 16.04 AMD64

Ce n'était pas facile à configurer sur Ubuntu 14.04, mais maintenant ça marche.

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

Sortie :

glfw_triangle.c

#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;
}

Les principales lignes de code sont :

#define GLFW_INCLUDE_ES2
#include <GLFW/glfw3.h>

GLFW_INCLUDE_ES2 est documenté sur :http://www.glfw.org/docs/latest/build_guide.html#build_macros et un rapide coup d'œil à la source montre qu'il est transmis à GLES :

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

Cette source semble être écrite dans le sous-ensemble commun de GLES et OpenGL (comme une grande partie de GLES), et se compile également avec -lGL si on supprime le #define GLFW_INCLUDE_ES2 .

Si nous ajoutons des choses qui ne sont pas dans GLES comme le rendu immédiat glBegin , le lien échoue comme prévu.

Voir aussi :https://askubuntu.com/questions/244133/how-do-i-get-egl-and-opengles-libraries-for-ubuntu-running-on-virtualbox

Crédits :genpfult a rendu le code beaucoup plus correct.

SDK ARM Mali OpenGL ES

  • télécharger depuis :http://malideveloper.arm.com/resources/sdks/opengl-es-sdk-for-linux/
  • ouvrir la documentation HTML sur un navigateur
  • suivez le "Guide de démarrage rapide", c'est simple

Contient plusieurs exemples open source intéressants + passe-partout du système de fenêtrage (X11 + EGL).

Le système de construction prend en charge la compilation croisée facile pour les SoC ARM / Mali, mais je ne l'ai pas encore testé.

Le composant clé inclus semble être "l'émulateur OpenGL ES" http://malideveloper.arm.com/resources/tools/opengl-es-emulator/ qui "mappe les appels d'API OpenGL ES 3.2 à l'API OpenGL". Mais cela n'est pas livré avec la source, seulement précompilé.

Utilise un CLUF d'entreprise personnalisé qui semble permissif, mais oui, demandez à votre avocat.

Testé sur le SDK v2.4.4.


Linux
  1. Comment empaqueter des applications Python pour Linux

  2. Comment j'utilise cron sous Linux

  3. Comment améliorer le temps de démarrage des applications sous Linux

  4. Comment démarrer des applications de démarrage avec un délai sous Linux

  5. Comment créer une fenêtre sous Linux avec C++ ?

Comment démarrer automatiquement des applications sur Ubuntu 20.04 Focal Fossa Linux

Comment exécuter des applications DOS sous Linux

Comment trouver des applications installées avec une taille installée sous Linux

Comment rendre Debian Linux plus rapide

Comment installer des applications Linux hors ligne avec Cube

Comment puis-je regarder mes flux de webcams sous Linux ?