当前位置:  开发笔记 > 编程语言 > 正文

Qt和OpenGLWindow - 调整大小的闪烁

如何解决《Qt和OpenGLWindow-调整大小的闪烁》经验,为你挑选了0个好方法。

在此输入图像描述

看来如果我足够快地拖动调整大小,窗口本身就是通过子类化qwindow并在其上创建一个openGLcontext来创建的.

码:

#include 
#include 
#include 
#include 
#include 

class OpenGLWindow : public QWindow, protected QOpenGLFunctions_3_3_Core{

     public:
     explicit OpenGLWindow();
     ~OpenGLWindow();
     virtual void render();
     bool isWindowInitialized;
     void exposeEvent(QExposeEvent *event);
     bool event(QEvent *event);

     private:
     QOpenGLContext* ctx;
     QSurfaceFormat* fmt;
     bool isGLInitialized;
     GLuint VertexArrayID;
     GLuint buffer1;
     GLuint ProgramID;
};

bool OpenGLWindow::event(QEvent *event)
{
     switch (event->type()) {
     case QEvent::UpdateRequest:
     render();
     return true;
     case QEvent::Close:
     glDisableVertexAttribArray(0);
     glDeleteBuffers(1, &buffer1);
     glDeleteVertexArrays(1, &VertexArrayID);
     glDeleteProgram(ProgramID);
     return QWindow::event(event);
     case QEvent::Resize:
     if(isWindowInitialized && isGLInitialized)glViewport(0,0,width(),height());
     return QWindow::event(event);
     default:
     return QWindow::event(event);
     }
}

void OpenGLWindow::exposeEvent(QExposeEvent *event)
{
    Q_UNUSED(event);
    if (isExposed())render();
}

OpenGLWindow::OpenGLWindow()
    :ctx(new QOpenGLContext)
    ,fmt(new QSurfaceFormat)
    ,isGLInitialized(0)
{
     setSurfaceType(OpenGLSurface);
     fmt->setRenderableType(QSurfaceFormat::OpenGL);
     fmt->setVersion(3,3);
     resize(640,480);
     fmt->setProfile(QSurfaceFormat::CoreProfile);
     setFormat(*fmt);
     ctx->setFormat(*fmt);
     ctx->create();
}

OpenGLWindow::~OpenGLWindow()
{}

void OpenGLWindow::render(){

 //if(Image::isWindowInitialized || isExposed())return;

 if(!isGLInitialized){

         ctx->makeCurrent(this);
         initializeOpenGLFunctions();

         GLuint vsID = glCreateShader(GL_VERTEX_SHADER);
         GLuint fsID = glCreateShader(GL_FRAGMENT_SHADER);

         const char* vs="#version 330 core\n layout(location = 0) in vec3 vertexPosition_modelspace; \n void main(){ gl_Position.xyz = vertexPosition_modelspace; gl_Position.w = 1.0;}";

         const char* fs="#version 330 core\n out vec4 color;\n void main(){ color = vec4(1,0,0,1);}";

         glShaderSource(vsID, 1, &vs , NULL);
         glCompileShader(vsID);
         GLint isCompiled = 0;
         glGetShaderiv(vsID, GL_COMPILE_STATUS, &isCompiled);

         if(isCompiled == GL_FALSE){
         GLint maxLength = 0;
         glGetShaderiv(vsID, GL_INFO_LOG_LENGTH, &maxLength);
         char info[512];
         glGetShaderInfoLog(vsID, maxLength, &maxLength, info);
         printf("%s",info);}

        glShaderSource(fsID, 1, &fs , NULL);
         glCompileShader(fsID);
         glGetShaderiv(fsID, GL_COMPILE_STATUS, &isCompiled);

        if(isCompiled == GL_FALSE){
         GLint maxLength = 0;
         glGetShaderiv(fsID, GL_INFO_LOG_LENGTH, &maxLength);
         char info[512];
         glGetShaderInfoLog(fsID, maxLength, &maxLength, info);
         printf("%s",info);
        }

        GLuint ProgramID = glCreateProgram();
         glAttachShader(ProgramID, vsID);
         glAttachShader(ProgramID, fsID);
         glLinkProgram(ProgramID);
         glDeleteShader(vsID);
         glDeleteShader(fsID);

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


        glGenVertexArrays(1, &VertexArrayID);
        glBindVertexArray(VertexArrayID);
        glGenBuffers(1, &buffer1);
        glBindBuffer(GL_ARRAY_BUFFER,buffer1);
        glBufferData(GL_ARRAY_BUFFER, sizeof(data1),data1, GL_STATIC_DRAW);
        glEnableVertexAttribArray(0);
        glVertexAttribPointer(0 ,3 ,GL_FLOAT ,GL_FALSE,0 ,(void*)0 );
        glClearColor(1.0f, 0.0f, 0.4f,1.0f);
        glUseProgram(ProgramID);
        glViewport(0,0,width(),height());
        isGLInitialized=true;
    }

     if(isExposed()){
     glClear( GL_COLOR_BUFFER_BIT );
     glDrawArrays(GL_TRIANGLES, 0, 3);
     ctx->swapBuffers(this);
     }
}

int main(int argc, char **argv)
{
     QGuiApplication app(argc, argv);
     OpenGLWindow* win = new OpenGLWindow();
     win->show();
     win->isWindowInitialized=true;
     return app.exec();
}

我在Qt Creator 3.4.1工具包上使用Qt 5.4.2:桌面Qt 5.4.2 MSVC2013 64位

因为我从来没有在qt中使用openGL,所以kida在这里丢失了,我很难想象问题可能来自哪里

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有