2014-07-12 87 views
0

所以我正在製作一個C++遊戲,我正在使用SDL2和OpenGL/GLEW。我試圖在我的窗口上繪製基本形狀,但是,它應該繪製一個三角形時創建一個黑色屏幕。這是代碼。OpenGL沒有繪製到SDL2窗口

遊戲循環:

int main(int argc, char** argv) { 

    Window window("Test", 600, 400); 
    RenderingEngine e(window); 

    e.Init(); 

    while (!window.IsCloseRequested()) { 
     window.SwapBuffers(); 
     e.Render(); 
    } 

    return 0; 
} 

窗口類:

Window::Window(const std::string& title, unsigned int width, unsigned int height) : 
    m_title(title), m_width(width), m_height(height), m_isCloseRequested(false) { 

    SDL_Init(SDL_INIT_VIDEO); 

    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); 
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); 

    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); 
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); 

    m_window = SDL_CreateWindow(title.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 
     width, height, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN); 
    m_glContext = SDL_GL_CreateContext(m_window); 
    SDL_GL_MakeCurrent(m_window, m_glContext); 

    SDL_GL_SetSwapInterval(1); 
    glewExperimental = GL_TRUE; 

    GLenum res = glewInit(); 

    if (res != GLEW_OK) { 
     std::cerr << "Error initializting OpenGL." << std::endl; 
     exit(1); 
    } 
} 

void Window::SwapBuffers() { 
    SDL_GL_SwapWindow(m_window); 
} 

RenderingEngine類:

RenderingEngine::RenderingEngine(const Window& window) : m_window(&window) { 

} 

RenderingEngine::~RenderingEngine() { 
    if (m_window) delete m_window; 
} 

void RenderingEngine::Init() { 
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 

    glFrontFace(GL_CW); 
    glCullFace(GL_BACK); 

    glEnable(GL_CULL_FACE); 
    glEnable(GL_DEPTH_TEST); 

    glDepthFunc(GL_LESS); 

    glEnable(GL_FRAMEBUFFER_SRGB); 
} 

void RenderingEngine::Render() { 
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glColor3f(1.0f, 1.0f, 1.0f); 

    glBegin(GL_TRIANGLES); 
     glVertex3f(-1.0f, -1.0f, 0.0f); 
     glVertex3f(1.0f, -1.0f, 0.0f); 
     glVertex3f(0.0f, 1.0f, 0.0f); 
    glEnd(); 
} 

我想不通爲什麼它沒有在屏幕上繪圖,所以任何非常感謝幫助。謝謝!

回答

1

你設置背面剔除指定您的前置三角形已經順時針纏繞順序,並且要剔除未正面面對一切:

glFrontFace(GL_CW); 
glCullFace(GL_BACK); 
glEnable(GL_CULL_FACE); 

但您指定的三角形有反順時針方向纏繞順序:

glVertex3f(-1.0f, -1.0f, 0.0f); 
glVertex3f(1.0f, -1.0f, 0.0f); 
glVertex3f(0.0f, 1.0f, 0.0f); 

您可以通過在紙上繪製點進行驗證,使x軸向右和y軸向上。你會看到點的順序是逆時針繞原點。

基於此,您的三角形被背面剔除消除。由於採用逆時針環繞順序更常用OpenGL的使用,我建議通過改變glFrontFace()調用使用它:

glFrontFace(GL_CCW); 

還是不要打這個電話可言,因爲這是默認的。

+0

我改變了撲殺到逆時針順序,並正確地排列了我的頂點,但是,它在繪製時仍然只是一個黑屏。 – CMilby

+0

不需要改變頂點,它們已經是逆時針了。 –

+0

頂點按正確的逆時針順序排列,但屏幕仍然只是黑色。 – CMilby

0

你didn`t加載視點/投影/型號矩陣...我想這將是一個問題......如果你還希望在3.2的風格,使你應該使用着色器