Câu hỏi OpenGL: glGetError () trả về enum không hợp lệ sau khi gọi tới glewInit ()


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.

Tôi không thể biên dịch các shaders, 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 thất bại." 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 giúp ích gì.

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

Tôi đang làm gì sai?


20
2018-06-01 21:06


gốc


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


Các câu trả lời:


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

Nghe có vẻ như nó có thể được an toàn để bỏ qua miễn là bạn không nhìn thấy bất kỳ vấn đề khác.


21
2018-06-01 21:17



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 shaders, 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 thất bại." - Martin
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
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


Dường như glew không hoạt động chính xác ... Giải pháp đơn giản nhất đối với 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ế

#include <GL/glew.h>

với

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

và xóa tất 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

Nó có vẻ là quan trọng để giữ lá cờ epoxy trước những người khác.


-2
2018-03-24 04:12