2012-02-10 8 views
0

私はsfml2でOpenGLコンテキストを設定しようとしています。すべてがうまくいき、私は三角形を描くことができました。次のステップでは、SFの上にGL要素の上に2D要素を描画したいと考えています。だから私は最初に "RenderWindow"にすべての "Window"エントリを変更して何かを描くことができました。 arnoエラーはありますが、プログラムをコンパイルすると、描画前に常にクラッシュしてしまいます。理由はわかりません。 sfml1.6では、RenderWindowで動作しました。何がクラッシュするの?sfml2 RenderWindow + OpenGL

これは私のコードです:

#include <iostream> 
#include <glew.h> 
#include <SFML/Window.hpp> 
#include <SFML/System.hpp> 
#include <SFML/Graphics.hpp> 


using namespace std; 
using namespace sf; 

void handleEvents(RenderWindow*); 
void fillVBO(); 
void drawGL(); 

bool running = true; 
GLuint vertexBuffer; 

static const GLfloat vertex_buffer_data[] = { 
     -1.0f, -1.0f, 0.0f, 
     1.0f, -1.0f, 0.0f, 
     0.0f, 1.0f, 0.0f, 
}; 

int main() { 
    VideoMode mode; 
    mode.BitsPerPixel = 32; 
    mode.Width = 1024; 
    mode.Height = 768; 
    ContextSettings cs; 
    cs.AntialiasingLevel = 4; 
    cs.DepthBits = 32; 
    cs.StencilBits = 16; 
    cs.MajorVersion = 3; 
    cs.MinorVersion = 3; 

    RenderWindow App(mode, "SFML window", Style::Close|Style::Resize, cs); 

    cout << "Window OK" << endl; 

    if(glewInit() != GLEW_OK) { 
     cout << "Unable it initialize Glew!" << endl; 
     return -1; 
    } 
    else { 
     cout << "GLEW initialization OK" << endl; 
    } 
    glClearColor(0.0f, 0.0f, 0.3f, 0.0f); 

    fillVBO(); 

    cout << "Fill VBO OK" << endl; 

    while(running) { 
     App.SetActive(); 
     handleEvents(&App); 
     cout << "Handle Events OK" << endl; 
     drawGL(); 
     cout << "Draw GL OK" << endl; 

     App.Display(); 
    } 
    return EXIT_SUCCESS; 
} 

void handleEvents(RenderWindow* wnd) { 
    Event ev; 
    while(wnd->PollEvent(ev)) { 
     switch(ev.Type) { 
     case Event::Closed: 
      running = false; 
      break; 
     case Event::KeyPressed: 
      switch(ev.Key.Code) { 
      case Keyboard::Escape: 
       running = false; 
       break; 
      default: 
       break; 
      } 
      break; 
     case Event::Resized: 
      glViewport(0, 0, ev.Size.Width, ev.Size.Height); 
      break; 
     default: 
      break; 
     } 
    } 
} 

void fillVBO() { 
    glGenBuffers(1, &vertexBuffer); 
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); 

    glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_buffer_data), vertex_buffer_data, GL_STATIC_DRAW); 
} 

void drawGL() { 
    // 1rst attribute buffer : vertices 
    glEnableVertexAttribArray(0); 
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); 
    glVertexAttribPointer(
     0,     // attribute 0. No particular reason for 0, but must match the layout in the shader. 
     3,     // size 
     GL_FLOAT,   // type 
     GL_FALSE,   // normalized? 
     0,     // stride 
     (void*)0   // array buffer offset 
    ); 

    // Draw the triangle ! 
    glDrawArrays(GL_TRIANGLES, 0, 3); // Starting from vertex 0; 3 vertices total -> 1 triangle 

    glDisableVertexAttribArray(0); 
} 

答えて

0

私はSFMLフォーラムに助けを発見し、私はここで解決策を投稿しなければならないと思いました。

http://www.sfml-dev.org/forum/viewtopic.php?p=46348#46348

はあなたがglDisableClientStateを使用していないすべての配列を無効にする必要があり、このエラーを取り除くために()。その後、すべて正常に動作するはずです。