在QGraphicsView上使用OpenGL Shader

时间:2012-07-02 17:35:09

标签: qt opengl glsl qgraphicsview

我正在尝试在QGrapicsView上使用OpenGL Shader。 我的显卡是NVidia GeForce GT 425M。我使用NVidia驱动程序295.40在Ubuntu 12.04上进行了实验。

我创建一个包含两个QGraphicsView的QMainWindow,每个图形视图都显示相同的场景。在其中一个图形视图中,我设置了一个OpenGL View端口。 OpenGL View Port是一个QGLWidget,我加载了顶点和片段着色器程序。

看看我的QMainWindow构造函数:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    m_scene = new QGraphicsScene(this);
    ui->gvShaded->setScene(m_scene);
    ui->gvUnshaded->setScene(m_scene);
    m_glWidget = new QGLScene();
    ui->gvShaded->setViewport(m_glWidget);
    m_glWidget->updateGL();
    if(m_glWidget->context()->isValid())
    {
        qDebug()<<"GL Context is valid";
    }else
    {
        qWarning()<<"GL Context is not valid";
    }

    qDebug() << "Opengl Version : " << m_glWidget->context()->format().openGLVersionFlags();

    QBrush brush(QLinearGradient(0,0,20,0));
    brush.setColor(Qt::blue);
    QGraphicsRectItem* rect = m_scene->addRect(0,0,20,20,QPen(Qt::black), brush);

    ui->gvShaded->ensureVisible(rect);
    ui->gvUnshaded->ensureVisible(rect);
}

如您所见,我实例化了QGLScene对象:

class QGLScene : public QGLWidget
{
public:
    QGLScene(QWidget* _parent=0);
protected :
    virtual void initializeGL();
};

我的GLWidget构建是:

QGLScene::QGLScene(QWidget *_parent)
    :QGLWidget(QGLFormat(QGL::DepthBuffer), _parent)
{
}

initializeGL的定义是:

void QGLScene::initializeGL()
{
    qDebug() << __PRETTY_FUNCTION__;
    QGLShader fragmentShader(QGLShader::Fragment, context(), this);
    QGLShader vertexShader(QGLShader::Vertex, context(), this);
    QGLShaderProgram pgm(context(), this);
    if(vertexShader.compileSourceFile("./vertexShader.glsl"))
    {
        if(fragmentShader.compileSourceFile("./fragmentShader.glsl"))
        {
            pgm.addShader(&fragmentShader);
            pgm.addShader(&vertexShader);
            pgm.link();
            pgm.bind();
            qDebug() << "Shader bien chargé : "<< pgm.log();
        }else
        {
            qDebug() << "Problem when loading fragment shader :";
            qDebug() << fragmentShader.log();
            qDebug() << QString(fragmentShader.sourceCode());
        }
    }else
    {
        qDebug() << "Problem when loading vertex shader :";
        qDebug() << vertexShader.log();
        qDebug() << QString(vertexShader.sourceCode());
    }
}

我的着色器是非常无用的着色器: 顶点:

 #version 150

uniform mat4 viewMatrix, projMatrix;

in vec4 position;
in vec3 color;

out vec3 Color;

void main()
{
    Color = color;
    gl_Position = projMatrix * viewMatrix * position ;
}

片段:

#version 150

in vec3 Color;
out vec4 outputF;

void main()
{
    outputF = vec4(1.0, 0, 0, 1.);
}

所以我尝试将我的阴影图形视图作为一个大红色方块,因为我认为我强制像素为红色(在我的片段着色器中)。

我没有着色器编译错误,但我的两个场景是一样的。 当然,程序传入initializeGL函数(我可以读取 PRETTY_FUNCTION )。

有人有解释吗?

0 个答案:

没有答案