Mi piacerebbe sviluppare app OpenGL ES 2.0 sulla mia macchina Ubuntu. Non sono riuscito a trovare librerie/emulatori che supportino ancora GLES 2.0. Eventuali suggerimenti?Come sviluppare le applicazioni OpenGL ES (GLES) 2.0 su Linux?
risposta
È possibile utilizzare POWERVR SDK per emulare Opengl es sul PC. È possibile scaricare l'SDK here. L'archivio fornisce i passaggi necessari per installare le librerie di emulazione come file di documentazione e include tutorial e applicazioni demo con i codici sorgente.
Sviluppare su OpenGL 2.0 standard e non utilizzare la modalità immediata o la modalità funzione fissa. Essenzialmente il tuo programma sarà compatibile con ES 2.0.
Questa è la mia soluzione peggiore. Sfortunatamente non sono abbastanza esperto da dire quando sto entrando nel (non es) territorio gl. È per questo che sto cercando confini duri. –
Posso solo scoraggiare da questa soluzione. Il mio consiglio è di creare almeno un contesto openglES (glfw o altri strumenti potrebbero aiutarti) oppure puoi includere un'intestazione ES opengl che non definisce funzioni che non sono affatto usate. – Arne
Mesa supports it. Se si desidera limitarsi a OpenGL ES solo, è necessario crearlo in una directory separata e quindi aggiungere le directory di inclusione e libreria appropriate.
è possibile generare un'intestazione con solo le funzioni di cui si ha realmente bisogno. E con glfw puoi creare un contesto opengl es. Quindi non puoi usare accidentalmente funzioni che non vuoi usare, perché non saranno definite in questo modo. Ho trovato questo che potrebbe aiutarti qui.
GLFW, Mesa, Ubuntu 16.04 AMD64
questo non era facile da installare su Ubuntu 14.04, ma ora funziona solo.
sudo apt-get install libglfw3-dev libgles2-mesa-dev
gcc glfw_triangle.c -lGLESv2 -lglfw
uscita:
Fonte:
#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;
}
Le linee principali linee di codice sono:
#define GLFW_INCLUDE_ES2
#include <GLFW/glfw3.h>
GLFW_INCLUDE_ES2
è d ocumented a: http://www.glfw.org/docs/latest/build_guide.html#build_macros e un rapido sguardo alla fonte dimostra che inoltra a GLES:
#elif defined(GLFW_INCLUDE_ES2)
#include <GLES2/gl2.h>
#if defined(GLFW_INCLUDE_GLEXT)
#include <GLES2/gl2ext.h>
#endif
Questa fonte sembra essere scritto nel sottoinsieme comune di GLES e OpenGL (come gran parte GLES), e anche compila con -lGL
se rimuoviamo lo #define GLFW_INCLUDE_ES2
.
Se aggiungiamo elementi che non sono in GLES come il rendering immediato glBegin
, il collegamento non riesce come previsto.
Consulta anche: https://askubuntu.com/questions/244133/how-do-i-get-egl-and-opengles-libraries-for-ubuntu-running-on-virtualbox
Credits: genpfult reso il codice molto più corretto.
ARM Mali OpenGL ES SDK
- scaricare da: http://malideveloper.arm.com/resources/sdks/opengl-es-sdk-for-linux/
- aprire il codice HTML di documentazione su un browser
- seguire la "Guida rapida", è semplice
Contiene diversi esempi open source interessanti + boilerplate system window (X11 + EGL).
Il sistema di compilazione supporta una facile compilazione incrociata per SoC ARM/Mali, ma non l'ho ancora testato.
Il componente chiave incluso sembra essere "OpenGL ES Emulator" http://malideveloper.arm.com/resources/tools/opengl-es-emulator/ che "esegue il mapping delle API API OpenGL ES 3.2 all'API OpenGL". Ma questo non viene fornito con la fonte, ma solo precompilato.
Utilizza un EULA aziendale personalizzato che sembra essere permissivo, ma sì, chiedi al tuo avvocato.
Testato su SDK v2.4.4.
'#version 330 core' probabilmente attaccherà implementazioni Mesa ES 2.0. Probabilmente dovresti tornare a '#version 100' e' attrib'/'varying' invece di' in'/'out' /' layout'. Non pensate che i VAO siano in ES 2.0 non estesa. – genpfault
@genpfault se è possibile, postare la versione conforme a GLES 2 su un Gist o semplicemente modificarlo o collegarlo a un esempio corretto, e lo testerò nuovamente su Ubuntu e aggiornerò. Ovviamente, conosco ancora poco degli shader, ma avevo bisogno di un mondo GLES per i test di integrazione della piattaforma. –
Modificato, funziona con il mio laptop 'testing' di Debian con grafica Skylake e Mesa 11.2.2. – genpfault
- 1. OpenGL o OpenGL ES
- 2. OpenGL ES 2.0 IllegalArgumentException
- 3. OpenGL ES 2.0 + Cairo: HUD
- 4. Introduzione a OpenGL ES 2.0 su Windows
- 5. Emulatore Android OpenGL ES 2.0
- 6. Scegli OpenGL ES 1.1 o OpenGL ES 2.0?
- 7. Differenza tra OpenGL ES 2.0 e OpenGL 4
- 8. Piani di ritaglio in OpenGL ES 2.0
- 9. iPhone OpenGL ES 2.0 - Pixel Perfect Textures
- 10. PowerVR SGX535 Shader Performance (OpenGL ES 2.0)
- 11. Supporto OpenGL ES 2.0 per Android?
- 12. OpenGL ES 2.0 e glPushMatrix, glPopMatrix
- 13. Immagini e maschera in OpenGL ES 2.0
- 14. OpenGL ES 2.0 possibile senza NDK?
- 15. irrlicht android on opengl es 2.0 driver
- 16. Libgdx non utilizza Opengl ES 2.0
- 17. OpenGL ES 2.0 PNG canale alfa
- 18. OpenGL ES 2.0 GLKit con sfondo trasparente
- 19. Vertici dinamici veloci in OpenGL ES 2.0 su Android
- 20. Disegna un'immagine 2D usando OpenGL ES 2.0
- 21. Punti strutturati in OpenGL ES 2.0?
- 22. trama capovolta? | OpenGL-ES 2.0 (android)
- 23. Rendering CIImage in texture OpenGL ES 2.0 su iOS
- 24. Problemi con OpenGL ES 2.0 Camera
- 25. OpenGL ES 2.0 equivalente di glOrtho()?
- 26. Come sviluppare applicazioni IronPython su Mono?
- 27. Come ottenere un effetto shader "Glow" in OpenGL ES 2.0?
- 28. Come utilizzare OpenGL ES 2.0 in Android SDK (non NDK)?
- 29. Visualizzatore multipiattaforma in OpenGL ES
- 30. Come definire un array costante in GLSL (OpenGL ES 2.0)?
Ciò richiede una registrazione. La versione ARM Mali è un download aperto: http://www.malideveloper.com/opengl-es-20-emulator.php – ahcox
@ahcox Per non parlare di cca 300kb rispetto a 300mb +, include entrambe le librerie ES1 ed ES2 e l'hosting sembra supportare velocità superiori a 30kbps. Mi piacerebbe davvero ottenere l'SDK POWERVR (suppongo che otterrei il supporto PVRTC), ma questo è sciocco. Indubbiamente, Imagination Technologies potrebbe essere solo temporaneamente in difficoltà, eppure, se tu, ahcox, non avessi postato questo, mi arrenderei davvero. Avresti dovuto postare come risposta alternativa! :-) –