2017-09-03 14 views
-2

私は、C++とOpenGLを学ぶプロジェクトとして、単純なOpenGLレンダリングエンジンを開発中です。私は(これは私が知っている)でそれを行い、それをC++に翻訳しています。OpenGLデプステストが機能しない(GLEW/SDL2)

私はAssimpで読み込んだOBJファイルからキューブをレンダリングしようとしています。私は深さテスト/カリングを正しく設定していないようだが、私の人生にとっては間違っていることを理解できない。オブジェクトの後ろにある顔が淘汰されていないように見え、前にある顔の上にレンダリングしているように見えます。フロントの上にレンダリングされているいくつかのバック面を持つ立方体レンダリングの

画像が直面している:私はOpenGLを初期化し、ウィンドウを作成するためにGLEW + SDL2を使用しています

enter image description here

enter image description here

私は初期化するときに、以下の設定にしてください行っている:としての損失で私もバッファをクリアすることを確認してください

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の状態の変更は、有効なコンテキストが利用可能な場合にのみ可能です。プログラムでは、コンテキストが作成される前に深度テストを有効にしようとしています。

SDL_GL_CreateContextの後にglEnable(GL_DEPTH_TEST)を移動すると問題が解決するはずです。

関連する問題