VirtualBox에서 Ubuntu 용 EGL 및 OpenGLES 라이브러리를 실행하려면 어떻게해야합니까?


15

VirtualBox에서 Ubuntu를 실행하고 있습니다. 게스트 추가가 설치되었으며 이제 OS는 하드웨어 가속이 가능합니다. OpenGL 라이브러리가 있습니다.

이제 egl + opengles1.1 & 2.0을 사용하여 앱을 실행하고 싶습니다. 우분투에서 어떻게 구할 수 있습니까?

사용 가능한 오픈 소스 라이브러리가 있습니까?

라이브러리는 VirtualBox 제공 하드웨어 가속 기능을 사용해야합니다.


정확히 무엇을 요구하는지 말하기가 매우 어렵습니다. 좀 더 자세하게 설명 할 수 있습니까?
RolandiXor

답변:


9

GLFW, 메사, 우분투 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_ES2http://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 : //.com/questions/3809236/how-to-develop-opengl-es-gles-2-0-applications-on-linux/39356268#39356268

크레딧 : genpfult 는 코드를 훨씬 더 정확하게 만들었습니다.

ARM 말리 OpenGL ES SDK

몇 가지 흥미로운 오픈 소스 예제 + 윈도우 시스템 상용구 (X11 + EGL)가 포함되어 있습니다.

빌드 시스템은 ARM / Mali SoC에 대한 쉬운 크로스 컴파일을 지원하지만 아직 테스트하지는 않았습니다.

포함 된 주요 구성 요소는 "OpenGL ES 에뮬레이터" 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가 아마도 mesa-utils-extra 패키지에 있다고 말합니다 . 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-extra수도 있습니다 libegl1-mesa.


답장을 보내 주셔서 대단히 감사합니다. 그러나 Mesa는 하드웨어 가속을 위해 VirtualBox 가상 GPU를 사용하지 않습니다. VBox에서 Mesa를 실행하는 동안 소프트웨어 래스터 라이저를 사용합니다. 필자는 Opengles 데모에 가상 상자 3D 가속을 엄격하게 사용해야합니다.
vboxuser

그래서 우리는이 질문 / 여기를 보아야
qbi

1

ARM OpenGL ES 2.0 에뮬레이터를 사용해보십시오 . 저는 OpenGL ES 2.0을 작동시키지 못했지만 1.1은 잘 작동하는 것 같습니다 (simpleApp 데모). 알다시피, 에뮬레이터가 플랫폼 GL라이브러리를 사용하고 mesa3d가 (확실하지는 않음) 가속화 되면 하드웨어 가속이어야합니다 .

또한 있습니다 libgles2-mesa-불행히도 나는 그것을 작동시킬 수 없었습니다. es2gears / es2tri 샘플이 충돌하고 mesa 라이브러리에 연결된 simpleApp이 충돌합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.