-2
我正在研究一個簡單的opengl渲染引擎作爲學習C++和OpenGL的項目。我跟着一個youtube tutorial series,它在java中(我知道),並將其翻譯成C++。OpenGL深度測試不起作用(GLEW/SDL2)
我正在嘗試從我用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找到,如果我不知道要添加的問題有什麼缺失。
在此先感謝幫助!
屏幕截圖會有幫助 – Asesh
請在問題本身中發佈**所有相關代碼**。在你的情況下,你至少應該添加創建上下文/窗口的代碼以及深度測試初始化的地方。是否可以在窗口創建之前啓用深度測試? – BDL
已更新問題以包含相關代碼並具有更清晰的問題陳述。 是的!它是導致問題的glEnable()的位置。在glewInit()之後移動它們似乎解決了這個問題。 – Laserath