首页 > QT开发OpenGL无法显示图像[已解决]

QT开发OpenGL无法显示图像[已解决]

#ifndef GLWIDGET_H
#define GLWIDGET_H

#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QOpenGLShaderProgram>
#include <QOpenGLVertexArrayObject>
#include <QOpenGLBuffer>
#include <QMatrix4x4>
class GLWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
public:
    GLWidget(QWidget *parent=0);
    ~GLWidget();
protected:
    virtual void initializeGL() Q_DECL_OVERRIDE;
    virtual void paintGL() Q_DECL_OVERRIDE;
    virtual void resizeGL(int w, int h) Q_DECL_OVERRIDE;
    GLuint compileShaders();
private:
    QOpenGLShaderProgram *program;
    QOpenGLVertexArrayObject vao;
    QOpenGLBuffer vbo;
    static const char *vshader_source;
    static const char *fshader_source;
};


#endif // GLWIDGET_H

#include "glwidget.h"
#include <assert.h>
#include <QDebug>
#include <QGLFormat>

GLWidget::GLWidget(QWidget *parent) :
    QOpenGLWidget(parent)
{
}

GLWidget::~GLWidget()
{

}

void GLWidget::initializeGL()
{
    initializeOpenGLFunctions();
    GLfloat color[] = {0.0, 0.0, 0.0, 1.0};
    GLfloat points[] = {1.0,0.0,0.0,1.0,
                        0.0,1.0,0.0,1.0,
                        1.0,1.0,0.0,1.0};
    glClearBufferfv(GL_COLOR, 0, color);

    program = new QOpenGLShaderProgram();
    program->addShaderFromSourceCode(QOpenGLShader::Vertex, vshader_source);
    program->addShaderFromSourceCode(QOpenGLShader::Fragment, fshader_source);
    program->bindAttributeLocation("vertex", 0);
    program->link();
    assert(program->bind());

    vao.create();
    //vao.bind();
    QOpenGLVertexArrayObject::Binder vaoBinder(&vao);
    vbo.create();
    vbo.bind();
    vbo.allocate(points, sizeof(points));

    vbo.bind();
    QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
    f->glEnableVertexAttribArray(0);
    f->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
    vbo.release();

    program->release();
}

void GLWidget::paintGL()
{
    QOpenGLVertexArrayObject::Binder vaoBinder(&vao);
    program->bind();
    glDrawArrays(GL_TRIANGLES, 0, 3);
    program->release();
}

void GLWidget::resizeGL(int w, int h)
{

}

//GLuint GLWidget::compileShaders()
//{
//    GLint status;
//    GLchar log[1024];
//    vshader = glCreateShader(GL_VERTEX_SHADER);
//    glShaderSource(vshader, 1, vshader_source, NULL);
//    glCompileShader(vshader);
//    glGetShaderiv(vshader, GL_COMPILE_STATUS, &status);
//    glGetShaderInfoLog(vshader, 1024, NULL, log);
//    qDebug()<<log;
//    assert(status == GL_TRUE);

//    fshader = glCreateShader(GL_FRAGMENT_SHADER);
//    glShaderSource(fshader, 1, fshader_source, NULL);
//    glCompileShader(fshader);
//    glGetShaderiv(fshader, GL_COMPILE_STATUS, &status);
//    glGetShaderInfoLog(fshader, 1024, NULL, log);
//    qDebug()<<log;
//    assert(status == GL_TRUE);

//    GLuint program = glCreateProgram();
//    glAttachShader(program, vshader);
//    glAttachShader(program, fshader);
//    glLinkProgram(program);
//    glGetProgramiv(program, GL_LINK_STATUS, &status);
//    assert(status == GL_TRUE);

//    glDeleteShader(vshader);
//    glDeleteShader(fshader);

//    return program;
//}


const char *GLWidget::vshader_source =
    "attribute vec4 vertex;\n"
    "void main(){\n"
    "gl_Position = gl_Vertex;\n"
    "}\n";

const char *GLWidget::fshader_source =
    "void main(){                             \n"
    "gl_FragColor = vec4(0.0, 0.8, 1.0, 1.0); \n"
    "}                                        \n";

代码就以上这些,shader改了好几种都没用,实在没办法了,求大神解救!
已解决,设置vao属性那里大小应该是4

【热门文章】
【热门文章】