वर्चुअलबॉक्स पर Ubuntu के लिए ईजीएल और ओपनग्लस लाइब्रेरी कैसे प्राप्त करूं?


15

मेरे पास UbuntuBox VirtualBox पर चल रहा है। अतिथि जोड़ स्थापित किए गए हैं और अब ओएस हार्डवेयर त्वरण सक्षम है। मेरे पास जगह जगह OpenGL लाइब्रेरी है।

अब मैं egl + opengles1.1 और 2.0 का उपयोग करके ऐप्स चलाना चाहता हूं। मैं उन्हें Ubuntu पर कैसे प्राप्त करूं?

क्या कोई ओपन-सोर्स लाइब्रेरी उपलब्ध हैं?

पुस्तकालयों को वर्चुअलबॉक्स-प्रदान की गई हार्डवेयर त्वरण क्षमताओं का उपयोग करना चाहिए।


यह बताना बहुत मुश्किल है कि आप क्या पूछ रहे हैं, क्या आप थोड़ा और विस्तृत हो सकते हैं?
RolandiXor

जवाबों:


9

GLFW, मेसा, उबंटू 16.04 AMD64

मैंने इसे वर्चुअल बॉक्स के अंदर आज़माया नहीं है, लेकिन इस पर ध्यान दिए बिना काम करना चाहिए क्योंकि मेसा का सॉफ्टवेयर कार्यान्वयन है।

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

यदि हम उन चीजों को जोड़ते हैं जो जीएलईएस में नहीं हैं जैसे कि तत्काल प्रतिपादन glBegin, लिंक अपेक्षा के अनुरूप विफल रहता है।

इसे भी देखें: /programming/3809236/how-to-develop-opengl-es-gles-2-0-applications-on-linux/39356268#39356268

क्रेडिट: genpfult ने कोड को और अधिक सही बना दिया।

एआरएम माली ओपेनगल ईएस एसडीके

इसमें कई दिलचस्प ओपन सोर्स उदाहरण + विंडोिंग सिस्टम बॉयलरप्लेट (X11 + EGL) शामिल हैं।

निर्माण प्रणाली एआरएम / माली SoCs के लिए आसान क्रॉस संकलन का समर्थन करती है, लेकिन मैंने अभी तक इसका परीक्षण नहीं किया है।

इसमें शामिल प्रमुख घटक "OpenGL ES Emulator" http://malideveloper.arm.com/resources/tools/opengl-es-emulator/ प्रतीत होता है, जो "OpenGL ES 3.2 API कॉल को OpenGL API में मैप करता है"। लेकिन वह स्रोत के साथ जहाज नहीं करता है, केवल precompiled है।

एक कस्टम enterprisey 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 शायद पैकेज मेसा-बर्तन-अतिरिक्त में हैMesa 3D में OpenGLES के लिए एक परियोजना पृष्ठ है और वहां लिखते हैं:

मेसा OpenGL ES 1.1 और OpenGL ES 2.0 को लागू करता है। OpenGL ES के बारे में अधिक जानकारी http://www.khronos.org/opengles/ पर मिल सकती है ।

ईजीएल भी मेसा में बनाया गया है:

> 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-extraऔर शायद यह भी libegl1-mesa


उत्तर के लिए बहुत - बहुत धन्यवाद। लेकिन मेसा हार्डवेयर त्वरण के लिए वर्चुअलबॉक्स वर्चुअल GPU का उपयोग नहीं करता है। VBox पर मेसा को चलाने के दौरान यह सॉफ्टवेयर रैस्टराइज़र का उपयोग करता है। मेरी आवश्यकता ओपेंगल्स डेमो के लिए वर्चुअल बॉक्स 3 डी त्वरण का सख्ती से उपयोग करने की है।
vboxuser

तो शायद हमें यह / आपका प्रश्न यहाँ देखना चाहिए: forum.virtualbox.org/…
qbi

1

ARM OpenGL ES 2.0 एमुलेटर की कोशिश करें , मैं खुद OpenGL ES 2.0 को काम करने में कामयाब नहीं हुआ हूं, लेकिन 1.1 ठीक (simpleApp डेमो) लगता है। जैसा कि मैं समझता हूं, यह हार्डवेयर को त्वरित माना जाता है क्योंकि एमुलेटर प्लेटफ़ॉर्म GLलाइब्रेरीज़ का उपयोग करता है और mesa3d (निश्चित नहीं है कि हालांकि) त्वरित है।

वहाँ भी है libgles2-mesa- लेकिन दुर्भाग्य से मैं यह काम नहीं कर सका। es2gears / es2tri नमूने क्रैश हो जाते हैं और साथ ही simpleApp mesa libs के खिलाफ लिंक हो जाते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.