• 7240阅读
  • 3回复

[讨论]QOpenGLWindow 与 QPainter结合,怎么做? [复制链接]

上一主题 下一主题
离线sdaujiaojiao
 

只看楼主 倒序阅读 楼主  发表于: 2014-12-10
我看到一篇文章http://blog.qt.digia.com/blog/2014/11/20/qt-weekly-20-completing-the-offering-qopenglwindow-and-qrasterwindow/?utm_source=tuicool

里面有例子。我按照例子做了,但是得不到正确结果。代码贴出来。
  1. class Render : public QOpenGLWindow
  2. {
  3. public:
  4.     Render();
  5.     ~Render();
  6. protected:
  7.     void initializeGL();
  8.     void paintGL();
  9.     void resizeGL(int  w ,int h);
  10.      QOpenGLFunctions * f;
  11.      QOpenGLBuffer * triangle;
  12.      QOpenGLVertexArrayObject * vao;
  13.      QOpenGLShaderProgram * program;
  14.       QMatrix4x4 mv,p;
  15.       QTimer * time;
  16.       float rota;
  17.      //QPainter * painter;
  18. };

  1. GLfloat tri[] =
  2. {
  3.     0.0f,1.0f,-1.0f,1.0f,
  4.      1.0f,1.0f,-1.0f,1.0f,
  5.      1.0f,0.0f,-1.0f,1.0f,
  6. };
  7. Render::Render()
  8. {
  9.     QSurfaceFormat format;
  10.     format.setDepthBufferSize(24);
  11.     format.setStencilBufferSize(8);
  12.     format.setVersion(3,3);
  13.     format.setProfile(QSurfaceFormat::CoreProfile);
  14.     setFormat(format);
  15.     time = new QTimer;
  16.     connect(time,SIGNAL(timeout()),this,SLOT(update()));
  17.     time->start(50);
  18.     rota = 0;
  19. }
  20. Render::~Render()
  21. {
  22. }
  23. void Render::initializeGL()
  24. {
  25. //    f = QOpenGLContext::currentContext()->versionFunctions<QOpenGLFunctions_3_3_Core>();
  26. //    f->initializeOpenGLFunctions();
  27.     f = context()->functions();
  28.     program =  new QOpenGLShaderProgram;
  29.     program->addShaderFromSourceCode(QOpenGLShader::Vertex,
  30.                                      "#version 330 core \n\
  31.                                      layout(location = 0) in vec4 vertex;\
  32.             uniform mat4 mvp;\
  33.                                      void main() \
  34.             {\
  35.                 gl_Position = mvp * vertex;\
  36.              }");
  37.     program->addShaderFromSourceCode(QOpenGLShader::Fragment,
  38.                                      "#version 330 core \n\
  39.                                      out vec4 fragColor;\
  40.             void main() \
  41.     { \
  42.         fragColor = vec4(0.0f,1.0f,0.0f,1.0f);\
  43.     }");
  44.     program->link();
  45.     vao = new QOpenGLVertexArrayObject;
  46.     vao->create();
  47.     vao->bind();
  48.     triangle = new QOpenGLBuffer(QOpenGLBuffer::VertexBuffer);
  49.     triangle->create();
  50.     triangle->bind();
  51.     triangle->setUsagePattern(QOpenGLBuffer::StaticDraw);
  52.     triangle->allocate(tri,sizeof(tri));
  53.     program->enableAttributeArray(0);
  54.     program->setAttributeBuffer(0,GL_FLOAT,0,4,0);
  55.     f->glEnable(GL_DEPTH_TEST);
  56. }
  57. void Render::resizeGL(int w ,int h)
  58. {
  59.     p.setToIdentity();
  60.      p.perspective(35.0f,float(w)/float(h),1.0f,30.0f);
  61. }
  62. void Render::paintGL()
  63. {
  64.     program->bind();
  65.     f->glClearColor(0.5,0.5f,0.5f,1.0f);
  66.     f->glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  67.     f->glViewport(0,0,width(),height());
  68.     mv.setToIdentity();
  69.     mv.lookAt(QVector3D(0.0f,0.0f,5.0f),QVector3D(0.0f,0.0f,0.0f),QVector3D(0.0f,1.0f,0.0f));
  70.     mv.rotate(0.5+rota,0,1,0);
  71.     program->setUniformValue("mvp",p*mv);
  72.     vao->bind();
  73.     f->glDrawArrays(GL_TRIANGLES,0,3);
  74.     rota=rota+1.5;
  75.     rota=rota>360.0?0:rota;
  76.     QPainter pp(this);
  77.     pp.drawText(10,20,"dsdsds");
  78.     update();
  79. }


离线sdaujiaojiao

只看该作者 1楼 发表于: 2014-12-10
大家讨论一下啊

只看该作者 2楼 发表于: 2014-12-27
大神,我是来求教的。我想问一下在Qt中学习OpenGL有什么好的方法吗(我是OpenGL零基础,最近一直无法入门),
离线彩阳

只看该作者 3楼 发表于: 2014-12-28
我写了一些博客,大家可以过来指导讨论一下。
blog.csdn.net/gamesdev
上海Qt开发联盟,热忱地欢迎你的加入!
快速回复
限100 字节
 
上一个 下一个