QT5和opengl核心配置文件没有向我显示简单的着色器

时间:2015-10-16 15:08:01

标签: qt opengl

我是新成员,我有一个问题。 我想开发一个带有QT5和opengl核心配置文件的简单项目,用于期末项目。

我首先尝试了一个简单的例子,但没有任何反应。屏幕只显示红色背景,但不显示我写的着色器。

代码如下:

的main.cpp

#include <QApplication>
#include <QGLFormat>

#include "glwidget.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);


    //specify oepngl version and other stuff
    QGLFormat glFormat;
    glFormat.setVersion(4, 3);
    glFormat.setProfile(QGLFormat::CoreProfile);
    glFormat.setSampleBuffers(true);


    GLWidget w(glFormat);
    w.show();

   return a.exec();
}

glwidget.h

#ifndef GLWIDGET_H
#define GLWIDGET_H

#include <QGLWidget>

#include <QGLBuffer>
#include <QGLShaderProgram>

#include <QOpenGLVertexArrayObject>

class GLWidget : public QGLWidget
{
    Q_OBJECT

public:
    GLWidget(const QGLFormat& format, QWidget* parent = 0);

protected:
    virtual void initializeGL();
    virtual void resizeGL(int w, int h);
    virtual void paintGL();

    //virtual void keyPressEvent(QKeyEvent* e);

private:
    bool prepareShaderProgram(const QString& vertexShaderPath, const QString& fragmentShaderPath);

    QGLShaderProgram m_shader;
    QGLBuffer m_vertexBuffer;
    GLuint vertex_array_object;

};

#endif // GLWIDGET_H

glwidget.cpp

#include "glwidget.h"

GLWidget::GLWidget(const QGLFormat& format, QWidget* parent)
    :QGLWidget(format, parent),
      m_vertexBuffer(QGLBuffer::VertexBuffer)
{
}



void GLWidget::initializeGL()
{
    QGLFormat glFormat = QGLWidget::format();
    if(!glFormat.sampleBuffers())
        qWarning() << "Can't enable sample buffers";


    //set background color
    glClearColor(1.0f, 0.0f, 0.0f, 1.0f);

    //load the shaders
    if(!prepareShaderProgram("/home/sera/workspace/qtWorkspace/provaShader/simple.vert",
                             "/home/sera/workspace/qtWorkspace/provaShader/simple.frag"))
            return;

    //create and bind the vertex buffer to the context
    m_vertexBuffer.create();
    if(!m_vertexBuffer.bind())
    {
        qWarning() << "could not bind vertex buffer to the opengl context";
        return;
    }

    //bind program to the context
    if(!m_shader.bind())
    {
        qWarning() << "could not bind shader program to the context";
        return;
    }



}



bool GLWidget::prepareShaderProgram(const QString &vertexShaderPath, const QString &fragmentShaderPath)
{

    //load and compile shaders
    bool result = m_shader.addShaderFromSourceFile(QGLShader::Vertex, vertexShaderPath);
    if(!result)
        qWarning() << m_shader.log();

    result = m_shader.addShaderFromSourceFile(QGLShader::Fragment, fragmentShaderPath);
    if(!result)
        qWarning() << m_shader.log();


    //link shaders into program
    result = m_shader.link();
    if(!result)
        qWarning() << "could not link shader program" << m_shader.log();


    return result;
}



void GLWidget::resizeGL(int w, int h)
{
    //set the viewport
    glViewport(0, 0, w, qMax(h, 1));
}


void GLWidget::paintGL()
{
    //clear buffer with current color
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPointSize(40.0);
    glDrawArrays(GL_POINTS, 0, 1);
}



/*
void GLWidget::keyPressEvent( QKeyEvent* e )
{
    switch (e->key())
    {
        case Qt::Key_Escape:
           QCoreApplication::instance()->quit();
           break;

        default:
            QGLWidget::keyPressEvent( e );
    }
}
*/

simple.vert

#version 430 core

void main(void)
{
    gl_Position = vec4(1.0, 0.0, 0.0, 1.0);
}

simple.frag

#version 430 core

out vec4 color;

void main(void)
{
    color = vec4(1.0, 1.0, 1.0, 1.0);
}

结果就是图中的结果,但我在中间看到了一个点 result

有什么问题?

0 个答案:

没有答案