sfml2 RenderWindow + OpenGL - PullRequest
       14

sfml2 RenderWindow + OpenGL

0 голосов
/ 10 февраля 2012

Я пытаюсь настроить контекст OpenGL с помощью sfml2. Все работало нормально, и я смог нарисовать треугольник. На следующем шаге я хочу нарисовать некоторые 2D элементы с SFML поверх GL. Поэтому я сначала изменил все записи «Окна» на «RenderWindow», чтобы можно было что-то рисовать. Есть ошибки arno, но когда я компилирую программу, но она всегда вылетает перед рисованием, и я не знаю почему. С sfml1.6 он работал с RenderWindow. Что заставляет его падать?

это мой код:

#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);
}

1 Ответ

0 голосов
/ 13 февраля 2012

Я нашел помощь на форуме sfml и подумал, что должен выложить решение здесь.

http://www.sfml -dev.org / форум / viewtopic.php? P = 46348 # 46348

Чтобы избавиться от этой ошибки, вы должны отключить все массивы, которые вы не используете с glDisableClientState (). Тогда все должно работать нормально.

...