VirtualBox üzerinde Ubuntu için EGL ve OpenGLES kitaplıklarını nasıl edinebilirim?


15

VirtualBox üzerinde çalışan Ubuntu var. Konuk eklentileri yüklenir ve şimdi işletim sistemi donanım hızlandırma özelliğine sahiptir. Yerinde OpenGL kütüphanem var.

Şimdi egl + opengles1.1 ve 2.0 kullanarak uygulamaları çalıştırmak istiyorum. Onları Ubuntu'ya nasıl alabilirim?

Herhangi bir açık kaynak kütüphanesi var mı?

Kütüphaneler, VirtualBox tarafından sağlanan donanım hızlandırma yeteneklerini kullanmalıdır.


Tam olarak ne istediğini söylemek çok zor, biraz daha ayrıntılı olabilir misin?
RolandiXor

Yanıtlar:


9

GLFW, Mesa, Ubuntu 16.04 AMD64

Virtual Box'ın içinde denemedim, ancak Mesa'nın bir yazılım uygulaması olduğundan bu ne olursa olsun çalışmalıdır.

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

Çıktı:

Kaynak:

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

Kodun ana satır satırları:

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

GLFW_INCLUDE_ES2şu adreste belgelenmiştir: http://www.glfw.org/docs/latest/build_guide.html#build_macros ve kaynağa hızlı bir bakış, GLES'e yönlendirdiğini gösterir:

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

Bu kaynak, GLES ve OpenGL'nin ortak alt kümesinde (GLES'in çoğu gibi) olduğu gibi ve aynı zamanda -lGLkaldırırsak derler #define GLFW_INCLUDE_ES2.

Anında oluşturma gibi GLES'te olmayan şeyler eklersek glBegin, bağlantı beklendiği gibi başarısız olur.

Ayrıca bakınız: /programming/3809236/how-to-develop-opengl-es-gles-2-0-applications-on-linux/39356268#39356268

Kredi: genpfult kodu çok daha doğru hale getirdi.

ARM Mali OpenGL ES SDK

Birkaç ilginç açık kaynak örneği + pencere sistemi kazan plakası (X11 + EGL) içerir.

Yapı sistemi ARM / Mali SoC'ler için kolay çapraz derlemeyi destekler, ancak henüz test etmedim.

Dahil edilen anahtar bileşen, " OpenGL ES 3.2 API çağrılarını OpenGL API ile eşleyen " http://malideveloper.arm.com/resources/tools/opengl-es-emulator/ "OpenGL ES Emulator" gibi görünüyor . Ancak bu kaynak ile gönderilmez, sadece önceden derlenir.

Hoşgörülü görünen özel bir kurumsal EULA kullanır, ancak evet, avukatınıza sorun.

SDK v2.4.4 üzerinde test edilmiştir.


5

Soru sorulduğundan, bir paket ortaya çıktı ve yardımcı olabilir:

sudo apt-get install libgles2-mesa-dev

5

Paketleri ve paket içeriğini aşağıdakilerle arayabilirsiniz apt-cache:

> apt-cache search opengles 
mesa-utils-extra - Miscellaneous Mesa utilies (opengles, egl)

Çıktı, OpenGLES'in muhtemelen mesa-utils-extra paketinde olduğunu söylüyor . Mesa 3D , OpenGLES için bir proje sayfasına sahiptir ve orada yazar:

Mesa, OpenGL ES 1.1 ve OpenGL ES 2.0'ı uygular. OpenGL ES hakkında daha fazla bilgiyi http://www.khronos.org/opengles/ adresinde bulabilirsiniz .

EGL ayrıca Mesa'da yerleşiktir:

> apt-cache search mesa | grep -i egl
mesa-utils-extra - Miscellaneous Mesa utilies (opengles, egl)
libegl1-mesa - free implementation of the EGL API -- runtime
libegl1-mesa-dbg - free implementation of the EGL API -- debugging symbols
libegl1-mesa-dev - free implementation of the EGL API -- development files
libegl1-mesa-drivers - free implementation of the EGL API -- hardware drivers
libegl1-mesa-drivers-dbg - free implementation of the EGL API -- driver debugging symbols

Bu yüzden yüklemeniz gerekiyor mesa-utils-extrave muhtemelen de libegl1-mesa.


Cevabınız için çok teşekkür ederim. Ancak Mesa donanım hızlandırma için VirtualBox sanal GPU kullanmaz. Mesa'yı VBox üzerinde çalıştırırken yazılım rasterleştirici kullanır. Benim ihtiyacım kesinlikle Opengles demoları için sanal kutu 3D hızlandırma kullanmaktır.
vboxuser

Belki de bunu / sorunuzu burada izlemeliyiz
qbi

1

ARM OpenGL ES 2.0 Emulator'u deneyin , kendim OpenGL ES 2.0'ı çalıştırmayı başaramadım, ancak 1.1 iyi çalışıyor gibi görünüyor (simpleApp demosu). Anladığım kadarıyla, emülatör platform GLkitaplıklarını kullandığından ve mesa3d (emin değilim) hızlandığından donanım hızlandırması gerekiyordu .

Ayrıca var libgles2-mesa- ama maalesef çalıştıramadım. es2gears / es2tri örnekleri yanı sıra mesa libs karşı bağlantılı SimpleApp çöküyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.