2010-09-28 16 views

risposta

4

È 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.

+2

Ciò richiede una registrazione. La versione ARM Mali è un download aperto: http://www.malideveloper.com/opengl-es-20-emulator.php – ahcox

+1

@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! :-) –

2

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.

+4

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. –

+0

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

5

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.

0

è 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.

gl load from the unofficial opengl sdk

6

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

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.

+0

'#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

+0

@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. –

+0

Modificato, funziona con il mio laptop 'testing' di Debian con grafica Skylake e Mesa 11.2.2. – genpfault