2012-06-01 8 views
19

Uso GLEW e freeglut. Per qualche ragione, dopo una chiamata a glewInit(), glGetError() restituisce il codice di errore 1280, anche con glewExperimental = GL_FALSE.OpenGL: glGetError() restituisce enum non valido dopo la chiamata a glewInit()

Non riesco a compilare gli shader, glGetProgramInfoLog() restituisce "Vertex shader (s) non è stato compilato correttamente prima della chiamata a glLinkProgram(). Link failed." Sono stato in grado di compilare gli shader prima.

La reinstallazione dei driver non è stata di aiuto.

Ecco il mio codice:

int main(int argc, char* argv[]) 
{ 
    GLenum GlewInitResult, res; 

    InitWindow(argc, argv); 

    res = glGetError(); // res = 0 

    glewExperimental = GL_TRUE; 
    GlewInitResult = glewInit();  

    fprintf(stdout, "ERROR: %s\n", glewGetErrorString(GlewInitResult)); // "No error" 
    res = glGetError(); // res = 1280 

    glutMainLoop(); 

    exit(EXIT_SUCCESS); 
} 

void InitWindow(int argc, char* argv[]) 
{ 
    glutInit(&argc, argv); 

    glutInitContextVersion(4, 0); 
    glutInitContextFlags(GLUT_FORWARD_COMPATIBLE); 
    glutInitContextProfile(GLUT_CORE_PROFILE); 

    glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, 
    GLUT_ACTION_GLUTMAINLOOP_RETURNS); 

    glutInitWindowPosition(0, 0); 
    glutInitWindowSize(CurrentWidth, CurrentHeight); 
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); 

    WindowHandle = glutCreateWindow(WINDOW_TITLE); 

    GLenum errorCheckValue = glGetError(); 

    if (WindowHandle < 1) 
    { 
     fprintf(stderr, "ERROR: Could not create new rendering window.\n"); 
     exit(EXIT_FAILURE); 
    } 

    glutReshapeFunc(ResizeFunction); 
    glutDisplayFunc(RenderFunction); 
    glutIdleFunc(IdleFunction); 
    glutTimerFunc(0, TimerFunction, 0); 
    glutCloseFunc(Cleanup); 
    glutKeyboardFunc(KeyboardFunction); 
} 

Quello che sto facendo male?

+0

Stai facendo qualcosa con GlewInitResult? Forse dovresti chiamare glewGetErrorString invece di glGetError (per rilevare problemi glew) – Tim

+0

Non faccio nulla con GlewInitResult. glewGetErrorString restituisce "Nessun errore". – Martin

risposta

20

Hai visto il commento su questa pagina della wiki?

http://www.opengl.org/wiki/OpenGL_Loading_Library

E cita il motivo per cui questo accade, e si dice "in alcuni casi si può ancora ottenere GL_INVALID_ENUM dopo aver specificato glewExperimental a seconda della versione Glew".

Sembra che possa essere ignorato fino a quando non si notano altri problemi.

+0

Ho provato a commentare la riga, ho ancora enum invalido. Non riesco a compilare shader, glGetProgramInfoLog() restituisce "Vertex shader (s) non è stato compilato correttamente prima della chiamata a glLinkProgram(). Link failed." – Martin

+4

È necessario verificare gli shader prima di provare a collegare il programma: glGetShaderiv (GL_COMPILE_STATUS) e glGetShaderInfoLog(). Questo ti dirà perché non riescono a compilare. @malymato – Tim

+0

Whoops, ho avuto un errore sintattico nel mio shader. Grazie! – Martin

-2

Sembra che glew non funzioni correttamente ... La soluzione più semplice per me era usare libepoxy. Non richiede alcuna cosa di init. Basta sostituire il vostro

#include <GL/glew.h> 

con

#include <epoxy/gl.h> 
#include <epoxy/glx.h> 

e rimuovere tutto il codice Glew. Se usi gcc, dovrai anche sostituire "-lGLEW" con "-lepoxy". Questo è tutto. Ad esempio, ho qualcosa del tipo:

g++ main.cpp -lepoxy -lSDL2 -lSDL2_image -lSDL2_mixer -lglut -lGLU -o main 

Sembra essere importante mantenere la bandiera epossidica prima degli altri.

Problemi correlati