OpenGL版本停留在1.1软件

时间:2014-01-19 18:58:55

标签: opengl windows-7 sdl drivers glew

我一直在尝试使用OpenGL 4,第一个障碍实际上是装载GL4而不是MS Windows附带的恶心软件GL 1.1。我尝试使用GLEW,然后第二次更新我的驱动程序,仍然GL继续将版本设为1.1.0。事实证明,它不是GLEW的问题(它似乎也不需要GLEW),也不是SDL在内部破坏了某些东西(我考虑过,因为这是我用来创建上下文的东西)。 Andon M. Coleman 提出了像素格式问题,这是我开始时完全忽视的问题。事实证明,我一直使用8位红色,绿色,蓝色和alpha,加上32位深度。我认为这是一个很好的甚至64位,颜色为32,距离为32。但是,由于SDL假设你也想要一个模板缓冲区(我现在实际上需要它),它实际上使像素格式为72位,这对于加速上下文是不允许的,因为GPU通常最多处理64位。因此,它默认为Windows提供的古老的GL 1.1支持,用于在没有驱动程序的情况下使用,也使其仅用于软件。

代码中还有很多其他东西,所以我已经把我试图做的基本样本放在一起。它是有效的C ++并在MinGW上编译,假设你正确链接它。

#include <gl\gl.h>
#include <SDL2\SDL.h>
#include <stdio.h>
#define SDL_main main
int main ()
{
    SDL_Init(SDL_INIT_EVERYTHING);
    SDL_GL_SetAttribute(SDL_GL_RED_SIZE,8);
    SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE,8);
    SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE,8);
    SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE,8);

    /// What I *was* doing...
    /* SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,32); */
    // And then I didn't even set SDL_STENCIL_SIZE at all.
    // Results in the entire size for each pixel being more than 64.

    /// What I *am* doing...
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,24);
    SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE,8);
    // Nice even 32 bits for this and 32 bits for the color is 64.

    SDL_Window* window = SDL_CreateWindow(
        "Hay GPU y is u no taek pixelz ovar 64 bitz?",
        SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED,
        1024,768,
        SDL_WINDOW_FULLSCREEN | SDL_WINDOW_OPENGL
    );
    SDL_GLContext context = SDL_GL_CreateContext(window);
    printf("GL Version [%s]\n",glGetString(GL_VERSION));
    SDL_DestroyWindow(window);
    SDL_GL_DeleteContext(context);
    SDL_Quit();
    return 0;
};

希望其他遇到类似问题的人可以从我的错误中吸取教训,或者至少能够将其标记为可能的问题列表。

1 个答案:

答案 0 :(得分:0)

From SDL docs

  

SDL_GL_CONTEXT_PROFILE_MASK确定创建的上下文类型,   同时SDL_GL_CONTEXT_MAJOR_VERSION和   SDL_GL_CONTEXT_MINOR_VERSION确定哪个版本。所有这三个   必须在创建第一个窗口之前设置属性   一般情况下,您无法更改SDL_GL_CONTEXT_PROFILE_MASK的值   没有先破坏用前一个创建的所有窗口   设置。

尝试为SDL_GL_CONTEXT_PROFILE_MASK,SDL_GL_CONTEXT_MAJOR_VERSION和SDL_GL_CONTEXT_MINOR_VERSION设置正确的值,这可能会解决问题(如果您的驱动程序实际上支持OpenGL 4.x上下文)