Как разрабатывать приложения OpenGL ES (GLES) 2.0 для Linux?

Я хотел бы разработать приложения OpenGL ES 2.0 на моей машине с Ubuntu. Я не мог найти библиотеки / эмуляторы, которые поддерживают GLES 2.0. Какие-либо предложения?

Ответы на вопрос(5)

который имеет только те функции, которые вам действительно нужны. А с glfw вы можете создать открытый контекст. Таким образом, вы не можете случайно использовать функции, которые вы не хотите использовать, потому что они не будут определены таким образом. Я нашел это, что может помочь вам здесь.

gl загрузить с неофициального opengl 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://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, ссылка не работает, как ожидалось.

Смотрите также: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»http://malideveloper.arm.com/resources/tools/opengl-es-emulator/ который "сопоставляет вызовы API OpenGL ES 3.2 с API OpenGL". Но это не поставляется с источником, только предварительно скомпилированным.

Использует пользовательское соглашение EULA, которое кажется разрешающим, но да, спросите своего адвоката.

Протестировано на SDK v2.4.4.

@genpfault, если можете, опубликуйте версию, совместимую с GLES 2, в Gist или просто отредактируйте ее или создайте ссылку на правильный пример, и я снова протестирую ее на своей Ubuntu и обновлю. Я, конечно, пока мало знаю о шейдерах, но мне нужен был привет GLES для тестирования интеграции платформ.
 genpfault07 сент. 2016 г., 07:30
Отредактировано, работает на моем Debiantesting ноутбук с графикой Skylake и Mesa 11.2.2.
 genpfault06 сент. 2016 г., 22:11
#version 330 core вероятно, душит не-Mesa ES 2.0 реализации. Должен, вероятно, вернуться к#version 100 & attrib /varying вместоin/out/layout, Не думайте, что VAO также находятся в расширенной версии ES 2.0.
@genpfault офигенно! Продолжает работать отлично для меня.
Решение Вопроса

Вы можете скачать SDKВот, В архиве содержатся необходимые шаги для установки библиотек эмуляции в виде файла документации, а также руководства и демонстрационные приложения с исходными кодами.

 ahcox15 мар. 2012 г., 22:56
Это требует регистрации. Версия ARM Mali является открытой для скачивания:malideveloper.com/opengl-es-20-emulator.php
 Ivan Vučica18 июн. 2012 г., 19:20
@ahcox Не говоря уже о том, что это около 300 КБ по сравнению с 300 МБ +, включает в себя как библиотеки ES1, так и ES2, и хостинг, похоже, поддерживает более высокие скорости, чем 30 Кбит / с. Я бы очень хотел получить POWERVR SDK (полагаю, я получу поддержку PVRTC), но это глупо. По общему признанию, Imagination Technologies может только временно испытывать трудности, но если бы вы, ахокс, не опубликовали это, я бы действительно сдался. Вы должны были опубликовать это как альтернативный ответ! :-)

Стандарт OpenGL 2.0и не используйте немедленный режим или режим фиксированной функции. По сути, ваша программа будет соответствовать стандарту ES 2.0.

 Arne15 февр. 2014 г., 19:07
Я могу только отговорить от этого решения. Мой совет - создать хотя бы контекст openglES (glfw или другие инструменты могут вам помочь), или вы можете включить заголовок opengl ES, который не определяет функции, которые вообще не используются.
 l.thee.a29 сент. 2010 г., 01:03
Это мое худшее решение. К сожалению, я не достаточно опытен, чтобы сказать, когда я вступаю на территорию (не) GL. Вот почему я ищу жесткие границы.

поддерживает это, Если вы хотите ограничиться OpenGL ESтолько затем вам нужно будет встроить его в отдельный каталог, а затем добавить соответствующие каталоги include и library.

Ваш ответ на вопрос