ฉันจะรับไลบรารี EGL และ OpenGLES สำหรับ Ubuntu ที่ใช้งานบน VirtualBox ได้อย่างไร


15

ฉันมี Ubuntu ที่ทำงานบน VirtualBox มีการติดตั้งอุปกรณ์เสริมของแขกและตอนนี้ระบบปฏิบัติการสามารถเร่งฮาร์ดแวร์ได้ ฉันมีห้องสมุด OpenGL แล้ว

ตอนนี้ฉันต้องการเรียกใช้แอพโดยใช้ egl + opengles1.1 & 2.0 ฉันจะรับพวกเขาบน Ubuntu ได้อย่างไร

มีไลบรารีโอเพนซอร์สหรือไม่

ไลบรารีควรใช้ความสามารถในการเร่งความเร็วด้วยฮาร์ดแวร์ของ VirtualBox


เป็นการยากมากที่จะบอกว่าสิ่งที่คุณถามคุณมีรายละเอียดเพิ่มเติมได้ไหม?
RolandiXor

คำตอบ:


9

GLFW, Mesa, Ubuntu 16.04 AMD64

ฉันไม่ได้ลองใช้ใน Virtual Box แต่สิ่งนี้น่าจะใช้ได้เพราะ Mesa มีการนำซอฟต์แวร์ไปใช้

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ลิงก์จะล้มเหลวตามที่คาดไว้

ดูเพิ่มเติมที่: /programming/3809236/how-to-develop-opengl-es-gles-2-0-applications-on-linux/39356268#39356268

เครดิต: genpfultทำให้รหัสถูกต้องมากขึ้น

ARM Mali OpenGL ES SDK

มีตัวอย่างโอเพนซอร์ซที่น่าสนใจหลายตัวอย่าง + ระบบสร้างหน้าต่างสำเร็จรูป (X11 + EGL)

ระบบ build สนับสนุนการรวบรวมข้ามง่าย ๆ สำหรับ ARM / Mali SoCs แต่ฉันยังไม่ได้ทดสอบ

องค์ประกอบหลักที่รวมอยู่ในนั้นดูเหมือนจะเป็น "OpenGL ES Emulator" http://malideveloper.arm.com/resources/tools/opengl-es-emulator/ซึ่ง "แมปการเรียก OpenGL ES 3.2 API กับ OpenGL API" แต่นั่นไม่ได้จัดส่งมาพร้อมกับแหล่งที่มาเท่านั้นที่รวบรวม

ใช้ EULA ผู้ประกอบการที่กำหนดเองที่ดูเหมือนจะอนุญาต แต่ใช่ขอให้ทนายความของคุณ

ทดสอบบน SDK v2.4.4


5

เนื่องจากคำถามได้รับการถามแพคเกจจะปรากฏขึ้นและสามารถช่วยได้:

sudo apt-get install libgles2-mesa-dev

5

คุณสามารถค้นหาแพ็คเกจและเนื้อหาแพ็คเกจได้ด้วยapt-cache:

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

การส่งออกกล่าวว่า OpenGLES น่าจะเป็นในแพคเกจเมซ่า-utils-พิเศษ Mesa 3Dมีหน้าโครงการสำหรับOpenGLESและเขียนที่นั่น:

Mesa ใช้ OpenGL ES 1.1 และ OpenGL ES 2.0 ข้อมูลเพิ่มเติมเกี่ยวกับ OpenGL ES สามารถพบได้ที่http://www.khronos.org/opengles/

EGL สร้างขึ้นใน 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

ดังนั้นคุณจึงจำเป็นต้องติดตั้งและอาจจะยังmesa-utils-extralibegl1-mesa


ขอบคุณมากสำหรับคำตอบ แต่ Mesa ไม่ได้ใช้ VirtualBox GPU เสมือนจริงเพื่อเร่งความเร็วฮาร์ดแวร์ ในขณะที่เรียกใช้ Mesa บน VBox จะใช้ rasterizer ซอฟต์แวร์ ความต้องการของฉันคือการใช้การเร่งความเร็วกล่องเสมือน 3D อย่างเข้มงวดสำหรับการสาธิต OpenGL
vboxuser

ดังนั้นบางทีเราควรดูคำถามนี้ของคุณที่นี่: forums.virtualbox.org/…
qbi

1

ลองใช้ARM OpenGL ES 2.0 Emulatorฉันเองยังไม่สามารถจัดการให้ OpenGL ES 2.0 ทำงานได้ แต่ดูเหมือนว่า 1.1 จะทำงานได้ดี อย่างที่ฉันเข้าใจมันควรจะเป็นฮาร์ดแวร์ที่เร่งความเร็วเนื่องจากตัวจำลองใช้แพลตฟอร์มGLไลบรารีและ mesa3d นั้น (ไม่แน่ใจว่า) จะเร่งความเร็ว

นอกจากนี้ยังมีlibgles2-mesa- แต่น่าเสียดายที่ฉันไม่สามารถทำงานได้ ตัวอย่าง es2gears / es2tri ขัดข้องเช่นเดียวกับ simpleApp ที่เชื่อมโยงกับ mesa libs

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.