OpenGL深度测试不起作用(GLEW / SDL2)

时间:2017-09-03 06:26:05

标签: c++ opengl sdl-2

我正在研究一个简单的opengl渲染引擎,作为学习C ++和OpenGL的项目。我跟着一个youtube tutorial series,它在java(我知道)中执行它并将其转换为C ++。

我试图从我用Assimp读到的OBJ文件中渲染一个立方体。看来我没有正确设置深度测试/剔除,但不能为我的生活弄清楚我做错了什么。看来对象背面的面部不会被剔除,而是渲染在它们前面的面孔上。

立方体渲染的图像,其中一些背面在正面上渲染:

enter image description here

enter image description here

我正在使用GLEW + SDL2来初始化opengl并创建一个窗口。

我确保在初始化时设置以下内容:

Window::Window(const int width, const int height, const std::string& title)
{
    m_isClosed = false;
    RenderUtil::initGraphics();

    m_window = SDL_CreateWindow(title.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, SDL_WINDOW_OPENGL);
    m_glContext = SDL_GL_CreateContext(m_window);

    glewExperimental = GL_TRUE;
    GLenum status = glewInit();
    if (status != GLEW_OK) {
        std::cerr << "WARNING WILL ROBINSON!" << std::endl;
        std::cerr << "GLEW failed to initialize" << std::endl;
        std::cerr << "GLEW Error Code: " << status << std::endl;
        std::cerr << "GLEW Error Message: " << glewGetErrorString(status);
        exit(1);
    }
}

void RenderUtil::initGraphics() {
    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);
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
    SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32);
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);

    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);
    glEnable(GL_DEPTH_TEST);

    glEnable(GL_FRAMEBUFFER_SRGB);
}

在程序循环期间,我也要确保清除缓冲区

void RenderUtil::clearScreen() {
    // TODO: stencil buffer
    glClearColor(RU_CLEAR_R, RU_CLEAR_G, RU_CLEAR_B, RU_CLEAR_A);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}

我真的不知道造成这种情况的原因。项目的完整代码可以在GitHub找到。如果问题中缺少我不知道要添加的内容。

先谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

只有在有效的上下文可用时才能进行OpenGL状态更改。在您的程序中,您尝试在创建上下文之前启用深度测试。

glEnable(GL_DEPTH_TEST)之后移动SDL_GL_CreateContext可以解决问题。