LINUX.ORG.RU

[Qt][OpenGL]framebuffer'ы

 ,


0

1

Как бы так сформировать QGLFramebufferObject где-нибудь и, при выполнении определённых условий, перекинуть его содержимое в текущий render buffer? Вроде и в доках об этом упоминание есть(или я неправильно их понял). и вот тут вроде как вскользь упоминается нужное мне шаманство, но нигде конкретно не написано, как его сделать.

★★★

    // render the 'bubbles.svg' file into our framebuffer object
    QPainter fbo_painter(render_fbo);
    svg_renderer->render(&fbo_painter);
    fbo_painter.end();

    if (render_fbo != texture_fbo) {
        QRect rect(0, 0, render_fbo->width(), render_fbo->height());
        QGLFramebufferObject::blitFramebuffer(texture_fbo, rect,
                                              render_fbo, rect);
    }

Это не подойдет?

anonymous
()
Ответ на: комментарий от anonymous

о, мудрый и великий анонимус! Расскажи, что такое blit(гугль говорит, что это блитирование, но мне от этого честно-честно легче не стало)

gavlig ★★★
() автор топика
Ответ на: комментарий от gavlig

Просвещайся:
http://en.wikipedia.org/wiki/Bit_blit
http://www.opengl.org/registry/specs/EXT/framebuffer_blit.txt
http://doc.qt.nokia.com/latest/opengl-framebufferobject.html

Я почти не имел дела с OpenGL или графикой, так что сам не знаю что это. =)
Но я запускал пример из Qt, удалял строчку с вызовом blitFramebuffer и картинка (из svg) пропадала. Колдунство, не иначе.

anonymous
()
Ответ на: комментарий от gavlig

> glBlitFramebuffer — copy a block of pixels from the read framebuffer to the draw framebuffer

copy a block of pixels

перекинуть его содержимое



Почему не оно?

anonymous
()
Ответ на: комментарий от anonymous

сначала почитал википедию, там сказано

operation in which several bitmaps are combined into one using a raster operator

Почитал доки опенгл, попробовал сделать blit заранее сформированного фреймбуфера в 0(в доках сказано, что 0 в качестве target будет означать, что targer = default framebuffer).

Может у кого-нибудь есть пример использования этой радости?

gavlig ★★★
() автор топика
Ответ на: комментарий от gavlig
#include <QtOpenGL>
#include <QSvgRenderer>
#include <QtGui/QApplication>
#include <QtGui/QMessageBox>

class GLWidget : public QGLWidget {
    Q_OBJECT
public:
    GLWidget(QWidget *parent) : QGLWidget(QGLFormat(QGL::SampleBuffers|QGL::AlphaChannel), parent) {
      makeCurrent();
      render_fbo = new QGLFramebufferObject(width(), height());
      svg_renderer = new QSvgRenderer(QLatin1String("../bubbles.svg"), this);
      connect(svg_renderer, SIGNAL(repaintNeeded()), this, SLOT(draw()));
    }
    ~GLWidget() { delete render_fbo; }
    void paintEvent(QPaintEvent *) { draw(); }

public slots:
    void draw() {
      // This is required, can't tell why though.
      QPainter painter(this);

      // Target and source rects for blitFramebuffer must be the same for
      // proper rendering, can't tell why either.
      if (render_fbo->width() != width() || render_fbo->height() != height()) {
        delete render_fbo;
        render_fbo = new QGLFramebufferObject(width(), height());
      }

      // render the 'bubbles.svg' file into our framebuffer object
      QPainter fbo_painter(render_fbo);
      svg_renderer->render(&fbo_painter);
      fbo_painter.end();

      QRect rect(0, 0, render_fbo->width(), render_fbo->height());
      QGLFramebufferObject::blitFramebuffer(0, rect, render_fbo, rect);
    }

private:
    QSvgRenderer *svg_renderer;
    QGLFramebufferObject *render_fbo;
};

int main(int argc, char **argv) {
    QApplication a(argc, argv);
    if (!QGLFormat::hasOpenGL() || !QGLFramebufferObject::hasOpenGLFramebufferObjects()) {
        QMessageBox::information(0, "OpenGL framebuffer objects",
         "This system does not support OpenGL/framebuffer objects.");
        return -1;
    }

    GLWidget widget(0);
    widget.resize(640, 480);
    widget.show();
    return a.exec();
}

#include "moc_main.cpp"
anonymous
()
Ответ на: комментарий от anonymous

Анон, преклоняюсь пред твоей мудростью! Всё, что мне было нужно лежало у меня под носом, но я не смог это разглядеть. Большое спасибо!

gavlig ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.