GNU/Linux >> Znalost Linux >  >> Linux

Jak vyvíjet aplikace OpenGL ES (GLES) 2.0 na Linuxu?

Mesa to podporuje. Pokud se chcete omezit na OpenGL ES pouze pak jej budete muset zabudovat do samostatného adresáře a poté přidat příslušné adresáře include a knihovny.


Aktualizace:

PowerVR SDK můžete (stále) používat a nyní podporuje i Vulkan. Aktualizované odkazy:

  • Stránka PowerVR SDK:https://www.imgtec.com/developers/powervr-sdk-tools/powervr-sdk/
  • Stránka pro stažení instalačních programů:https://www.imgtec.com/developers/powervr-sdk-tools/installers/
  • Úložiště Github:https://github.com/powervr-graphics/Native_SDK

V době mé původní odpovědi bylo PowerVR SDK nejúplnějším řešením (Mesa získala plnou podporu OpenGL ES 2.0 s vydáním 3.1 podle své stránky Wikipedie).

Nyní mohou být na výběr také Mesa a Mali SDK. Podrobné informace o nich najdete v této podrobné odpovědi od Ciro Santilli 冠状病毒审查六四事件法轮功

Původní odpověď:

K emulaci Opengl na vašem PC můžete použít POWERVR SDK. SDK si můžete stáhnout zde. Archiv poskytuje nezbytné kroky k instalaci emulačních knihoven jako dokumentační soubor a obsahuje výukové programy a ukázkové aplikace se zdrojovými kódy.


GLFW, Mesa, Ubuntu 16.04 AMD64

Toto nebylo snadné nastavit na Ubuntu 14.04, ale teď to prostě funguje.

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

Výstup:

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

Klíčové řádky kódu jsou:

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

GLFW_INCLUDE_ES2 je zdokumentován na:http://www.glfw.org/docs/latest/build_guide.html#build_macros a rychlý pohled na zdroj ukazuje, že přeposílá GLES:

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

Zdá se, že tento zdroj je napsán ve společné podmnožině GLES a OpenGL (jako většina GLES) a také se kompiluje s -lGL pokud odstraníme #define GLFW_INCLUDE_ES2 .

Pokud přidáme věci, které nejsou v GLES, jako je okamžité vykreslování glBegin , odkaz selže podle očekávání.

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

Kredity:genpful udělal kód mnohem přesnější.

ARM Mali OpenGL ES SDK

  • stáhnout z:http://malideveloper.arm.com/resources/sdks/opengl-es-sdk-for-linux/
  • otevřete HTML dokumentace v prohlížeči
  • postupujte podle "Příručky pro rychlý start", je to jednoduché

Obsahuje několik zajímavých příkladů open source + popis systému oken (X11 + EGL).

Systém sestavení podporuje snadnou křížovou kompilaci pro ARM / Mali SoC, ale to jsem ještě netestoval.

Klíčovou součástí se zdá být "OpenGL ES Emulator" http://malideveloper.arm.com/resources/tools/opengl-es-emulator/, který "mapuje volání OpenGL ES 3.2 API na OpenGL API". To se však nedodává se zdrojem, pouze předkompilovaný.

Používá vlastní podnikovou smlouvu EULA, která se zdá být tolerantní, ale ano, zeptejte se svého právníka.

Testováno na SDK v2.4.4.


Linux
  1. Jak zabalit aplikace Python pro Linux

  2. Jak nainstalovat Python na Linux

  3. Jak nainstalovat Javu na Linux

  1. Jak používat BusyBox na Linuxu

  2. Jak používám cron v Linuxu

  3. Jak rozdělit disk v Linuxu

  1. Jak zlepšit dobu spouštění aplikací v Linuxu

  2. Jak spouštět aplikace se zpožděním v systému Linux

  3. Jak vytvoříte okno v Linuxu s C++?