2012-06-01 63 views
19

Tôi sử dụng GLEW và freeglut. Vì lý do nào đó, sau khi gọi hàm glewInit(), glGetError() trả về mã lỗi 1280, ngay cả với glewExperimental = GL_FALSE.OpenGL: glGetError() trả về enum không hợp lệ sau khi gọi đến glewInit()

Tôi không thể biên dịch bóng đổ, glGetProgramInfoLog() trả về "Vertex shader (s) không được biên dịch thành công trước khi glLinkProgram() được gọi. Liên kết không thành công." Tôi đã có thể biên dịch các trình đổ bóng trước đây.

Cài đặt lại trình điều khiển không có tác dụng.

Dưới đây là mã của tôi:

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

Những gì tôi đang làm sai?

+0

Bạn có đang làm gì với GlewInitResult không? Có lẽ bạn nên gọi glewGetErrorString thay vì glGetError (để phát hiện vấn đề glew) – Tim

+0

Tôi không làm bất cứ điều gì với GlewInitResult. glewGetErrorString trả về "Không có lỗi". – Martin

Trả lời

20

Bạn có thấy nhận xét trên trang wiki này không?

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

Nó đề cập đến lý do tại sao điều này xảy ra, và nó nói "trong một số trường hợp, bạn vẫn có thể nhận được GL_INVALID_ENUM sau khi xác định glewExperimental tùy thuộc vào phiên bản glew của bạn".

Có vẻ như bạn có thể an toàn khi bỏ qua miễn là bạn không gặp phải bất kỳ sự cố nào khác.

+0

Tôi đã cố gắng để bình luận ra dòng, tôi vẫn nhận được enum không hợp lệ. Tôi không thể biên dịch bóng đổ, glGetProgramInfoLog() trả về "Vertex shader (s) không được biên dịch thành công trước khi glLinkProgram() được gọi. Liên kết không thành công." – Martin

+4

Bạn nên xác minh các trình đổ bóng trước khi thử liên kết chương trình: glGetShaderiv (GL_COMPILE_STATUS) và glGetShaderInfoLog(). Điều đó sẽ cho bạn biết lý do tại sao họ không biên dịch. @malymato – Tim

+0

Rất tiếc, tôi đã gặp lỗi cú pháp trong trình đổ bóng của mình. Cảm ơn! – Martin

-2

Dường như glew không hoạt động chính xác ... Giải pháp dễ nhất cho tôi là sử dụng libepoxy. Nó không đòi hỏi bất kỳ điều init nào. Chỉ cần thay thế của bạn

#include <GL/glew.h> 

với

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

và loại bỏ tất cả các mã glew. Nếu bạn sử dụng gcc, bạn cũng sẽ phải thay thế "-lGLEW" bằng "-lepoxy". Đó là nó. Ví dụ tôi có một cái gì đó như:

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

Điều quan trọng là phải giữ cờ epoxy trước những người khác.

Các vấn đề liên quan