2017-09-03 132 views
-2

我正在研究一個簡單的opengl渲染引擎作爲學習C++和OpenGL的項目。我跟着一個youtube tutorial series,它在java中(我知道),並將其翻譯成C++。OpenGL深度測試不起作用(GLEW/SDL2)

我正在嘗試從我用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找到,如果我不知道要添加的問題有什麼缺失。

在此先感謝幫助!

+0

屏幕截圖會有幫助 – Asesh

+3

請在問題本身中發佈**所有相關代碼**。在你的情況下,你至少應該添加創建上下文/窗口的代碼以及深度測試初始化​​的地方。是否可以在窗口創建之前啓用深度測試? – BDL

+0

已更新問題以包含相關代碼並具有更清晰的問題陳述。 是的!它是導致問題的glEnable()的位置。在glewInit()之後移動它們似乎解決了這個問題。 – Laserath

回答

1

只有當有效的上下文可用時,OpenGL狀態更改纔是可能的。在您的程序中,您正嘗試在上下文創建之前啓用深度測試。

移動glEnable(GL_DEPTH_TEST)SDL_GL_CreateContext應該解決問題。