glGetString(GL_VERSION)返回1.1.0,尽管该卡支持2.1

glGetString(GL_VERSION) returns 1.1.0, even though card supports 2.1

本文关键字:支持 GL VERSION glGetString 返回      更新时间:2023-10-16

我在SDL2和OpenGL方面遇到了一个小问题。我一直在尝试让VBO工作(特别是ARB对象),但到目前为止都没有成功。通过各种搜索,我发现了GL.h是多么古老,并选择了glew.h,从而允许我使用1.1之后的功能。

在尝试使用glGenBuffersARB时,我发现即使在调用glewInit之后,函数指针也是空的。

然而,visualinfo报告OpenGL是2.1.0,并且GL_ARB_vertex_buffer_object可以访问——SDL上下文似乎默认为Microsoft的1.1.0,并且不允许我更正空指针。

我(很遗憾)使用的是Acer Aspire 5733上的Intel HD Graphics芯片组。

如何让SDL识别芯片组上的2.1.0?(或者我的做法完全错了吗?)

编辑

以下是请求的代码:

astralmin.cpp(inits SDL+OpenGL上下文)

bool AstralGame::onInit()
{
    if (SDL_Init(SDL_INIT_EVERYTHING) < 0) return false;
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
    SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
    SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 2);
    SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
    SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);
    SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 32);
    SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1);
    if ((currWindow = SDL_CreateWindow(ASTRAL_TITLE" "ASTRAL_VERSION, 100, 100, 800, 600, SDL_WINDOW_RESIZABLE | SDL_WINDOW_OPENGL)) == nullptr)
    {
        a_ErrorManager::panic("Window couldn't be createdn");
        return false;
    }
    if ((currContext = SDL_GL_CreateContext(currWindow)) == NULL)
    {
        a_ErrorManager::panic("OpenGl context couldn't be createdn");
    }
    printf((char*)glGetString(GL_VERSION));
    glewExperimental = TRUE;
    glewInit();
    SDL_GL_SetSwapInterval(1);
    textureManager->startUp();
    errorManager->startUp();
    renderManager->startUp();
    if (glGenBuffersARB == nullptr) printf("This entire program will not work!");
    cube = new a_GL_Cube(textureManager->getTexture("astral")->texture);
    //Start initting GL functions
    glShadeModel(GL_SMOOTH);
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClearDepth(1.0f);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glEnable(GL_TEXTURE_2D);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    cube->buildVert(1.0f);
    return true;
}

a_GL3DPrimitives.cpp(为多维数据集构建顶点,出现错误)

void a_GL_Cube::buildVert(float size)
{
    float pVt[72] = { -size, -size, size, -size, size, size, size, size, size, size, -size, size,
        size, -size, size, size, -size, -size, size, size, -size, size, size, size,
        size, size, size, -size, size, size, -size, size, -size, size, size, -size,
        size, size, -size, size, -size, -size, -size, -size, -size, -size, size, -size,
        -size, size, size, -size, size, -size, -size, -size, -size, -size, -size, size,
        -size, -size, size, -size, -size, -size, size, -size, -size, size, -size, size };
    float pTt[48] = { 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,
        0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,
        0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,
        0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,
        0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,
        0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0 };
    vboVName = 0;
    vboTName = 0;
    unsigned int* test = &vboVName;
    glGenBuffersARB(1, &vboVName); <======= Null Pointer
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboVName);
    glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(float)* 72, pVt, GL_STATIC_DRAW_ARB);
    glGenBuffersARB(1, &vboTName);
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboTName);
    glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(float)* 48, pTt, GL_STATIC_DRAW_ARB);
    delete[] pVt;
    delete[] pTt;
}

我想你误解了glGetString(GL_VERSION) 的用途

首先,您当然需要创建一个OpenGL上下文,然后才能调用glGetString()。创建OpenGL上下文时,可以指定要使用的OpenGL版本。

然后,当您调用glGetString(GL_VERSION)时,它将返回当前使用的OpenGL上下文的OpenGL版本。

额外

正如我所看到的,你标记了你的问题,你可以使用glew来查看你的计算机支持哪些OpenGL版本。

std::cout << "OpenGL 2.0: " << ((GLEW_VERSION_2_0 != 0) ? "Available" : "Unavailable") << std::endl;
std::cout << "OpenGL 2.1: " << ((GLEW_VERSION_2_1 != 0) ? "Available" : "Unavailable") << std::endl;
std::cout << "OpenGL 3.0: " << ((GLEW_VERSION_3_0 != 0) ? "Available" : "Unavailable") << std::endl;
std::cout << "OpenGL 3.1: " << ((GLEW_VERSION_3_1 != 0) ? "Available" : "Unavailable") << std::endl;
std::cout << "OpenGL 3.2: " << ((GLEW_VERSION_3_2 != 0) ? "Available" : "Unavailable") << std::endl;
std::cout << "OpenGL 3.3: " << ((GLEW_VERSION_3_3 != 0) ? "Available" : "Unavailable") << std::endl;
std::cout << "OpenGL 4.0: " << ((GLEW_VERSION_4_0 != 0) ? "Available" : "Unavailable") << std::endl;
std::cout << "OpenGL 4.1: " << ((GLEW_VERSION_4_1 != 0) ? "Available" : "Unavailable") << std::endl;
std::cout << "OpenGL 4.2: " << ((GLEW_VERSION_4_3 != 0) ? "Available" : "Unavailable") << std::endl;
std::cout << "OpenGL 4.3: " << ((GLEW_VERSION_4_3 != 0) ? "Available" : "Unavailable") << std::endl;
std::cout << "OpenGL 4.4: " << ((GLEW_VERSION_4_4 != 0) ? "Available" : "Unavailable") << std::endl;

请注意,在执行上述操作之前,您当然需要创建一个OpenGL上下文并调用glewInit()

我不确定以下内容,但如果你做了类似上面的事情,它输出"不可用",当你确定它可用时,那么它可能与当前OpenGL上下文使用的OpenGL版本有关

尝试的东西:

  1. 删除所有SDL_GL_SetAttribute()调用。您可能对像素格式进行了过度约束。把它们一次一个地加回来,找出你越界的地方。

  2. 只删除SDL_GL_CONTEXT_*调用,因为您没有尝试请求GL3.x上下文。