Advertisement
Guest User

Using FBO in Qt 5

a guest
Feb 10th, 2013
643
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.14 KB | None | 0 0
  1. #include <QtCore>
  2. #include <QtGui>
  3. #include <QtWidgets>
  4.  
  5. void nativePainting()
  6. {
  7.     static const float vertexPositions[] = {
  8.         -0.8f, -0.8f, 0.0f,
  9.          0.8f, -0.8f, 0.0f,
  10.          0.0f,  0.8f, 0.0f
  11.     };
  12.  
  13.     static const float vertexColors[] = {
  14.         1.0f, 0.0f, 0.0f,
  15.         0.0f, 1.0f, 0.0f,
  16.         0.0f, 0.0f, 1.0f
  17.     };
  18.  
  19.     QOpenGLBuffer vertexPositionBuffer(QOpenGLBuffer::VertexBuffer);
  20.     vertexPositionBuffer.create();
  21.     vertexPositionBuffer.setUsagePattern(QOpenGLBuffer::StaticDraw);
  22.     vertexPositionBuffer.bind();
  23.     vertexPositionBuffer.allocate(vertexPositions, 9 * sizeof(float));
  24.  
  25.     QOpenGLBuffer vertexColorBuffer(QOpenGLBuffer::VertexBuffer);
  26.     vertexColorBuffer.create();
  27.     vertexColorBuffer.setUsagePattern(QOpenGLBuffer::StaticDraw);
  28.     vertexColorBuffer.bind();
  29.     vertexColorBuffer.allocate(vertexColors, 9 * sizeof(float));
  30.  
  31.     QOpenGLShaderProgram program;
  32.     program.addShaderFromSourceCode(QOpenGLShader::Vertex,
  33.                                     "#version 330\n"
  34.                                     "in vec3 position;\n"
  35.                                     "in vec3 color;\n"
  36.                                     "out vec3 fragColor;\n"
  37.                                     "void main() {\n"
  38.                                     "    fragColor = color;\n"
  39.                                     "    gl_Position = vec4(position, 1.0);\n"
  40.                                     "}\n"
  41.                                     );
  42.     program.addShaderFromSourceCode(QOpenGLShader::Fragment,
  43.                                     "#version 330\n"
  44.                                     "in vec3 fragColor;\n"
  45.                                     "out vec4 color;\n"
  46.                                     "void main() {\n"
  47.                                     "    color = vec4(fragColor, 1.0);\n"
  48.                                     "}\n"
  49.                                     );
  50.     program.link();
  51.     program.bind();
  52.  
  53.     vertexPositionBuffer.bind();
  54.     program.enableAttributeArray("position");
  55.     program.setAttributeBuffer("position", GL_FLOAT, 0, 3);
  56.  
  57.     vertexColorBuffer.bind();
  58.     program.enableAttributeArray("color");
  59.     program.setAttributeBuffer("color", GL_FLOAT, 0, 3);
  60.  
  61.     glDrawArrays(GL_TRIANGLES, 0, 3);
  62. }
  63.  
  64. QImage createImageWithFBO()
  65. {
  66.     QSurfaceFormat format;
  67.     format.setMajorVersion(3);
  68.     format.setMinorVersion(3);
  69.  
  70.     QWindow window;
  71.     window.setSurfaceType(QWindow::OpenGLSurface);
  72.     window.setFormat(format);
  73.     window.create();
  74.  
  75.     QOpenGLContext context;
  76.     context.setFormat(format);
  77.     if (!context.create())
  78.         qFatal("Cannot create the requested OpenGL context!");
  79.     context.makeCurrent(&window);
  80.  
  81.     const QRect drawRect(0, 0, 400, 400);
  82.     const QSize drawRectSize = drawRect.size();
  83.  
  84.     QOpenGLFramebufferObjectFormat fboFormat;
  85.     fboFormat.setSamples(16);
  86.     fboFormat.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
  87.  
  88.     QOpenGLFramebufferObject fbo(drawRectSize, fboFormat);
  89.     fbo.bind();
  90.  
  91.     QOpenGLPaintDevice device(drawRectSize);
  92.     QPainter painter;
  93.     painter.begin(&device);
  94.     painter.setRenderHints(QPainter::Antialiasing | QPainter::HighQualityAntialiasing);
  95.  
  96.     painter.fillRect(drawRect, Qt::blue);
  97.  
  98.     painter.drawTiledPixmap(drawRect, QPixmap(":/qt-project.org/qmessagebox/images/qtlogo-64.png"));
  99.  
  100.     painter.setPen(QPen(Qt::green, 5));
  101.     painter.setBrush(Qt::red);
  102.     painter.drawEllipse(0, 100, 400, 200);
  103.     painter.drawEllipse(100, 0, 200, 400);
  104.  
  105.     painter.beginNativePainting();
  106.     nativePainting();
  107.     painter.endNativePainting();
  108.  
  109.     painter.setPen(QPen(Qt::white, 0));
  110.     QFont font;
  111.     font.setPointSize(24);
  112.     painter.setFont(font);
  113.     painter.drawText(drawRect, "Hello FBO", QTextOption(Qt::AlignCenter));
  114.  
  115.     painter.end();
  116.  
  117.     fbo.release();
  118.     return fbo.toImage();
  119. }
  120.  
  121. int main(int argc, char **argv)
  122. {
  123.     QApplication app(argc, argv);
  124.  
  125.     QImage targetImage = createImageWithFBO();
  126.  
  127.     QLabel label;
  128.     label.setPixmap(QPixmap::fromImage(targetImage));
  129.     label.show();
  130.     return app.exec();
  131. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement