2012-06-01 12 views
19

Używam GLEW i freeglut. Z jakiegoś powodu, po wywołaniu glewInit(), glGetError() zwraca kod błędu 1280, nawet z glewExperimental = GL_FALSE.OpenGL: glGetError() zwraca nieprawidłowe wyliczenie po wywołaniu glewInit()

Nie mogę skompilować modułów cieniujących, glGetProgramInfoLog() zwraca "Vertex shader (s) nie zostały pomyślnie skompilowane przed wywołaniem funkcji glLinkProgram(). Połączenie nie powiodło się." Udało mi się wcześniej skompilować shadery.

Ponowna instalacja sterowników nie pomogła.

Oto mój kod:

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); 
} 

Co robię źle?

+0

Czy robisz cokolwiek z GlewInitResult? Może powinieneś wywoływać glewGetErrorString zamiast glGetError (dla wykrywania problemów z glewami) – Tim

+0

Nic nie robię z GlewInitResult. glewGetErrorString zwraca "Brak błędu". – Martin

Odpowiedz

20

Czy widziałeś komentarz na tej stronie wiki?

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

Wspomina, dlaczego tak się dzieje, a on mówi: „w niektórych przypadkach można jeszcze dostać GL_INVALID_ENUM po określeniu glewExperimental zależności od glew wersji”.

Wygląda na to, że może być bezpiecznie zignorować, o ile nie widzisz żadnych innych problemów.

+0

Próbowałem skomentować linię, wciąż otrzymuję nieprawidłowe wyliczenie. Nie mogę skompilować shaderów, glGetProgramInfoLog() zwraca "Vertex shader (s) nie zostały pomyślnie skompilowane przed wywołaniem funkcji glLinkProgram(). Połączenie nie powiodło się." – Martin

+4

Powinieneś zweryfikować shadery, zanim spróbujesz połączyć program: glGetShaderiv (GL_COMPILE_STATUS) i glGetShaderInfoLog(). Dzięki temu dowiesz się, dlaczego nie udało się skompilować. @malymato – Tim

+0

Ups, miałem błąd składniowy w moim cieniu. Dzięki! – Martin

-2

Wygląda na to, że po prostu nie działa poprawnie ... Najprostszym rozwiązaniem dla mnie było używanie libepoxy. Nie wymaga żadnej rzeczy początkowej. Wystarczy wymienić

#include <GL/glew.h> 

z

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

i usunąć cały kod glew. Jeśli używasz gcc, będziesz musiał również zamienić "-LGLEW" na "-lepoxy". to jest to! Na przykład mam coś takiego:

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

Wydaje się, że ważne jest, aby zachować flagę epoksydową przed innymi.

Powiązane problemy