VirtualBox에서 Ubuntu를 실행하고 있습니다. 게스트 추가가 설치되었으며 이제 OS는 하드웨어 가속이 가능합니다. OpenGL 라이브러리가 있습니다.
이제 egl + opengles1.1 & 2.0을 사용하여 앱을 실행하고 싶습니다. 우분투에서 어떻게 구할 수 있습니까?
사용 가능한 오픈 소스 라이브러리가 있습니까?
라이브러리는 VirtualBox 제공 하드웨어 가속 기능을 사용해야합니다.
VirtualBox에서 Ubuntu를 실행하고 있습니다. 게스트 추가가 설치되었으며 이제 OS는 하드웨어 가속이 가능합니다. OpenGL 라이브러리가 있습니다.
이제 egl + opengles1.1 & 2.0을 사용하여 앱을 실행하고 싶습니다. 우분투에서 어떻게 구할 수 있습니까?
사용 가능한 오픈 소스 라이브러리가 있습니까?
라이브러리는 VirtualBox 제공 하드웨어 가속 기능을 사용해야합니다.
답변:
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_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
하면 링크가 예상대로 실패합니다.
참조 : 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에서 테스트되었습니다.
다음을 사용하여 패키지 및 패키지 내용을 검색 할 수 있습니다 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
.
ARM OpenGL ES 2.0 에뮬레이터를 사용해보십시오 . 저는 OpenGL ES 2.0을 작동시키지 못했지만 1.1은 잘 작동하는 것 같습니다 (simpleApp 데모). 알다시피, 에뮬레이터가 플랫폼 GL
라이브러리를 사용하고 mesa3d가 (확실하지는 않음) 가속화 되면 하드웨어 가속이어야합니다 .
또한 있습니다 libgles2-mesa
-불행히도 나는 그것을 작동시킬 수 없었습니다. es2gears / es2tri 샘플이 충돌하고 mesa 라이브러리에 연결된 simpleApp이 충돌합니다.