OpenGL 深度测试不工作 (GLEW/SDL2)
OpenGL Depth Testing not working (GLEW/SDL2)
我正在开发一个简单的 opengl 渲染引擎,作为学习 C++ 和 OpenGL 的项目。我正在跟随 youtube tutorial series 在 java 中执行此操作(我知道)并将其翻译为 C++。
我在尝试从使用 Assimp 读入的 OBJ 文件渲染立方体时遇到了障碍。看来我没有正确设置深度 testing/culling 但我终究无法弄清楚我做错了什么。对象背面的面似乎没有被剔除,而是渲染在它们前面的面上。
一些背面渲染在正面上的立方体渲染图像:
我正在使用 GLEW + SDL2 来初始化 opengl 并创建 window。
我确保在初始化时设置了以下内容:
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 找到该项目的完整代码,以防我不知道要添加的问题缺少某些内容。
在此先感谢您的帮助!
OpenGL 状态更改仅在有效上下文可用时才有可能。在您的程序中,您试图在创建上下文之前启用深度测试。
在 SDL_GL_CreateContext
之后移动 glEnable(GL_DEPTH_TEST)
应该可以解决问题。
我正在开发一个简单的 opengl 渲染引擎,作为学习 C++ 和 OpenGL 的项目。我正在跟随 youtube tutorial series 在 java 中执行此操作(我知道)并将其翻译为 C++。
我在尝试从使用 Assimp 读入的 OBJ 文件渲染立方体时遇到了障碍。看来我没有正确设置深度 testing/culling 但我终究无法弄清楚我做错了什么。对象背面的面似乎没有被剔除,而是渲染在它们前面的面上。
一些背面渲染在正面上的立方体渲染图像:
我正在使用 GLEW + SDL2 来初始化 opengl 并创建 window。
我确保在初始化时设置了以下内容:
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 找到该项目的完整代码,以防我不知道要添加的问题缺少某些内容。
在此先感谢您的帮助!
OpenGL 状态更改仅在有效上下文可用时才有可能。在您的程序中,您试图在创建上下文之前启用深度测试。
在 SDL_GL_CreateContext
之后移动 glEnable(GL_DEPTH_TEST)
应该可以解决问题。