Làm cách nào để tôi có được thư viện EGL và OpenGLES cho Ubuntu chạy trên VirtualBox?


15

Tôi có Ubuntu chạy trên VirtualBox. Bổ sung khách được cài đặt và bây giờ HĐH là khả năng tăng tốc phần cứng. Tôi có thư viện OpenGL tại chỗ.

Bây giờ tôi muốn chạy các ứng dụng bằng egl + opengles1.1 & 2.0. Làm thế nào để tôi có được chúng trên Ubuntu?

Có thư viện mã nguồn mở nào không?

Các thư viện nên sử dụng các khả năng tăng tốc phần cứng do VirtualBox cung cấp.


Rất khó để nói chính xác những gì bạn đang hỏi, bạn có thể chi tiết hơn một chút không?
RolandiXor

Câu trả lời:


9

GLFW, Mesa, Ubuntu 16.04 AMD64

Tôi chưa thử nó trong Virtual Box, nhưng nó sẽ hoạt động bất kể vì Mesa có triển khai phần mềm.

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

Đầu ra:

Nguồn:

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

Các dòng mã chính là:

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

GLFW_INCLUDE_ES2được ghi lại tại: http://www.glfw.org/docs/latest/build_guide.html#build_macros và xem nhanh nguồn cho thấy rằng nó chuyển tiếp tới GLES:

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

Nguồn này dường như nằm trong tập hợp con phổ biến của GLES và OpenGL (giống như phần lớn GLES), và cũng biên dịch -lGLnếu chúng ta loại bỏ #define GLFW_INCLUDE_ES2.

Nếu chúng tôi thêm những thứ không có trong GLES như kết xuất ngay lập tức glBegin, liên kết sẽ thất bại như mong đợi.

Xem thêm: /programming/3809236/how-to-develop-opengl-es-gles-2-0-appluggest-on-linux/39356268#39356268

Tín dụng: genpfult làm cho mã chính xác hơn nhiều.

ARM ARM OpenGL ES SDK

Chứa một số ví dụ mã nguồn mở thú vị + bản tóm tắt hệ thống cửa sổ (X11 + EGL).

Hệ thống xây dựng hỗ trợ biên dịch chéo dễ dàng cho ARM / Mali SoC, nhưng tôi chưa thử nghiệm điều đó.

Thành phần chính bao gồm dường như là "Trình giả lập OpenGL ES" http://malideveloper.arm.com/resource/tools/opengl-es-emulator/ trong đó "ánh xạ các lệnh gọi API OpenGL ES 3.2 tới API OpenGL". Nhưng điều đó không vận chuyển với nguồn, chỉ được biên dịch trước.

Sử dụng một enterprisey tùy chỉnh EULA có vẻ được cho phép, nhưng vâng, hãy hỏi luật sư của bạn.

Đã thử nghiệm trên SDK v2.4.4.


5

Vì câu hỏi đã được hỏi, một gói đã xuất hiện và có thể giúp:

sudo apt-get install libgles2-mesa-dev

5

Bạn có thể tìm kiếm các gói và nội dung gói với apt-cache:

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

Đầu ra nói rằng OpenGLES có thể nằm trong gói mesa-utils-Extra . Mesa 3D có một trang dự án cho OpenGLES và viết ở đó:

Mesa triển khai OpenGL ES 1.1 và OpenGL ES 2.0. Thông tin thêm về OpenGL ES có thể được tìm thấy tại http://www.khronos.org/opengles/ .

EGL cũng được tích hợp vào Mesa:

> 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

Vì vậy, bạn cần phải cài đặt mesa-utils-extravà có lẽ cũng có libegl1-mesa.


Cảm ơn bạn rất nhiều cho trả lời. Nhưng Mesa không sử dụng GPU ảo VirtualBox để tăng tốc phần cứng. Trong khi chạy Mesa trên VBox, nó sử dụng phần mềm rasterizer. Yêu cầu của tôi là sử dụng nghiêm ngặt khả năng tăng tốc 3D của hộp ảo cho các bản demo của Opengles.
vboxuser

Vì vậy, có lẽ chúng ta nên xem này / câu hỏi của bạn ở đây: forums.virtualbox.org/...
qbi

1

Hãy thử Trình giả lập ARM OpenGL ES 2.0 , bản thân tôi đã không quản lý để làm cho OpenGL ES 2.0 hoạt động, nhưng 1.1 dường như chạy tốt (bản demo đơn giản). Theo tôi hiểu, nó được cho là tăng tốc phần cứng vì trình giả lập sử dụng GLcác thư viện nền tảng và mesa3d (không chắc chắn) được tăng tốc.

Cũng có libgles2-mesa- nhưng tiếc là tôi không thể làm cho nó hoạt động. mẫu es2gears / es2tri bị sập cũng như SimpleApp được liên kết với mesa libs.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.