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

Posted

技术标签:

【中文标题】OpenGL 深度测试不工作 (GLEW/SDL2)【英文标题】:OpenGL Depth Testing not working (GLEW/SDL2) 【发布时间】:2017-09-03 06:26:04 【问题描述】:

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

我在尝试从使用 Assimp 读取的 OBJ 文件中渲染立方体时遇到了麻烦。看来我没有正确设置深度测试/剔除,但我一生都无法弄清楚我做错了什么。对象背面的面似乎没有被剔除,而是渲染在它们前面的面上。

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

我正在使用 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找到,以防问题中缺少我不知道要添加的内容。

提前感谢您的帮助!

【问题讨论】:

截图会有帮助 请在问题本身中发布所有相关代码。在您的情况下,您至少应该在创建上下文/窗口和初始化深度测试的位置添加代码。会不会是在创建窗口之前启用了深度测试? 更新了问题以包含相关代码并有更清晰的问题陈述。是的!这是导致问题的 glEnable()s 的位置。在 glewInit() 似乎解决了问题之后移动它们。 【参考方案1】:

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

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

【讨论】:

以上是关于OpenGL 深度测试不工作 (GLEW/SDL2)的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL - 深度测试不起作用

OpenGL深度缓冲区不工作

GLEW + cmake 链接失败“未定义对符号 glDrawElements 的引用”+“命令行中缺少 DSO”

什么是OpenGL中的深度深度缓存深度测试?

◮OpenGL-深度测试

OpenGL ES之“深度测试”与“模板测试”的使用流程