glGetString(GL_VERSION)返回1.1.0,即使卡支持2.1

时间:2013-12-08 07:48:12

标签: c++ opengl sdl glew

我在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上使用英特尔高清显卡芯片组。

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

修改

以下是所请求的代码:

astralmain.cpp(在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 created\n");
        return false;
    }
    if ((currContext = SDL_GL_CreateContext(currWindow)) == NULL)
    {
        a_ErrorManager::panic("OpenGl context couldn't be created\n");
    }
    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;
}

2 个答案:

答案 0 :(得分:2)

我认为您误解了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()

我不确定以下内容,但如果您执行上述操作并输出&#34; Unavailable&#34;,当您确定知道它可用时,那么它可能与当前OpenGL上下文正在使用的OpenGL版本有关。

答案 1 :(得分:1)

要尝试的事情:

  1. 删除所有SDL_GL_SetAttribute()来电。您可能会过度约束像素格式。一次一个地添加它们以找出你超越的位置。

  2. 删除only the SDL_GL_CONTEXT_* calls,因为您没有尝试请求GL 3.x上下文。