我在 Qt 5 中编程 OpenGL 没有图像

Posted

技术标签:

【中文标题】我在 Qt 5 中编程 OpenGL 没有图像【英文标题】:I Program OpenGL in Qt 5 have no image 【发布时间】:2015-01-19 14:18:42 【问题描述】:
#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";

这是我的Qt代码,我多次尝试更改shader和其他代码,但所有代码都失败并且没有图像。我不知道,有没有人帮助我? 而且后来遇到这个问题,怎么才能找到这个程序不工作的原因,因为它不报任何错误,Qt5中OpenGL程序的信息很少。

好的,我发现代码中的错误是“ f->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); ”。 3 必须更改为 4。 但是我还是想知道如何在qt5上学习opengl。

【问题讨论】:

【参考方案1】:

好的,我在代码中发现了错误

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

void glVertexAttribPointer( GLuint index,
GLint size,
GLenum type,
GLboolean normalized,
GLsizei stride,
const GLvoid * pointer);

glVertexAttribPointer方法中的3必须改为4。

因为这指定了每个通用顶点属性的组件数量。必须是 1、2、3、4。此外,符号常量 GL_BGRA 被 glVertexAttribPointer 接受。初始值为 4。

【讨论】:

以上是关于我在 Qt 5 中编程 OpenGL 没有图像的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenGL 在 Qt 中显示来自 DirectShow 的原始图像数据

OPENGL和D3D哪个好

在没有 openGL 的情况下使用 Qt

QT 下opengl (认识)

Qt 4 中的 OpenGL 更新率

Qt 5.5 QOpenGLWidget链接错误未链接任何openGL调用