C++ SDL_GL_SetAttribute导致某些opengl函数为空

C++ SDL_GL_SetAttribute导致某些opengl函数为空,c++,opengl,sdl,C++,Opengl,Sdl,将值设置得更高,例如为SDL\u GL\u DEPTH\u SIZE设置32会导致glCreateShader为空 我不知道是什么导致了这种行为,因为我在设置属性和创建上下文时没有收到任何错误。这里有一个极简主义的例子 #include <iostream> #include <SDL2/SDL.h> #include <GL/glew.h> #include <SDL2/SDL_opengl.h> const int WIDTH = 800;

将值设置得更高,例如为
SDL\u GL\u DEPTH\u SIZE
设置32会导致
glCreateShader
为空

我不知道是什么导致了这种行为,因为我在设置属性和创建上下文时没有收到任何错误。这里有一个极简主义的例子

#include <iostream>
#include <SDL2/SDL.h>
#include <GL/glew.h>
#include <SDL2/SDL_opengl.h>

const int WIDTH = 800;
const int HEIGHT = 600;

int main(int argc, char **argv)
{
    SDL_Init(SDL_INIT_EVERYTHING);

    int response;
    response = SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, 
        SDL_GL_CONTEXT_PROFILE_CORE);

    response = SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
    response = SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
    response = SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);

    if (response < 0) {
        std::cout << "Setting Attribute: DEPTH_SIZE Failed\n";
        return 0;
    }

    SDL_Window *window = SDL_CreateWindow("TestApp", WIDTH >> 1, HEIGHT >> 1, WIDTH, HEIGHT, SDL_WINDOW_OPENGL);

    if (window == nullptr) {
        std::cout << "window not setup\n";
        return 0;
    }

    SDL_GLContext context = SDL_GL_CreateContext(window);
    if (context == nullptr) {
        std::cout << "context failed\n";
        return 0;
    }

    glewExperimental = GL_TRUE;

    if (GLEW_OK != glewInit()) {
        std::cout << "Failed to initialize glew\n";
        return 0;
    }

    glViewport(0, 0, WIDTH, HEIGHT);

    int value; 
    SDL_GL_GetAttribute(SDL_GL_DEPTH_SIZE, &value);
    std::cout << "Querying Depth size: " << value << "\n";

    std::cout << "glEnable: " << (glEnable ? "Available" : "NULL") << "\n";
    std::cout << "glCreateShader: " << (glCreateShader ? "Available" : "NULL") << "\n";

    SDL_GL_DeleteContext(context);
    SDL_DestroyWindow(window);
    SDL_Quit();
    return 0;
}
DEPTH\u SIZE=32位的输出

Querying Depth size: 24
glEnable: Available
glCreateShader: Available
Querying Depth size: 32
glEnable: Available
glCreateShader: NULL

如果您使用兼容性配置文件而不是核心,会怎么样?至少在windows上,GLEW因不能很好地使用核心配置文件而为人所知(或至少曾经为人所知)。请检查您的
GL\u版本
/
GL\u供应商
/
GL\u渲染器
字符串。在每种情况下,如果您在windows上,您可能会得到Microsoft GDI软件的回退(它只公开OpenGL 1.1或1.4,因此在32位深度缓冲区中缺少
glCreateShader()
)。@genpfault您是对的。它返回到1.1.0在
glewInit()之前使用
SDL\u GL\u MakeCurrent(…)