Qt 在QGraphicsView上使用OpenGL着色器
我正在尝试在QGraphicsView上使用OpenGL着色器。 我的图形卡是NVidia GeForce GT 425M。我用英伟达驱动程序295.40在Ubuntu 12.04上做了实验。 我创建了一个包含两个QGraphicsView的QMainWindow,每个图形视图都显示相同的场景。在其中一个图形视图上,我设置了一个OpenGL视图端口。 OpenGL视图端口是一个QGLWidget,我在加载顶点和片段着色器程序时过载了它 查看我的QMainWindow构造函数:Qt 在QGraphicsView上使用OpenGL着色器,qt,opengl,glsl,qgraphicsview,Qt,Opengl,Glsl,Qgraphicsview,我正在尝试在QGraphicsView上使用OpenGL着色器。 我的图形卡是NVidia GeForce GT 425M。我用英伟达驱动程序295.40在Ubuntu 12.04上做了实验。 我创建了一个包含两个QGraphicsView的QMainWindow,每个图形视图都显示相同的场景。在其中一个图形视图上,我设置了一个OpenGL视图端口。 OpenGL视图端口是一个QGLWidget,我在加载顶点和片段着色器程序时过载了它 查看我的QMainWindow构造函数: MainWindo
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);
}
我的GLWidget结构是:
QGLScene::QGLScene(QWidget *_parent)
:QGLWidget(QGLFormat(QGL::DepthBuffer), _parent)
{
}
初始值的定义如下:
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
in vec3 Color;
out vec4 outputF;
void main()
{
outputF = vec4(1.0, 0, 0, 1.);
}
因此,我尝试将着色图形视图设置为一个大的红色正方形,因为我认为我在片段着色器中强制将像素设置为红色
我没有着色器编译错误,但我的两个场景是相同的。
当然,程序传入initializeGL函数,我可以读取PRETTY_函数
有人对此有解释吗?您是否检查链接器错误以及编译错误?您可以在这两个阶段获得它们,但我看不到对pgm.link操作的任何检查;pgm.bind;这两行返回true,因此没有链接问题……着色器是堆栈上实例化的对象。它们的引用在初始化后丢失。我没有看到任何漂亮的函数着色器bien chargé?。这段代码应该是segfault。您是否检查链接器错误以及编译错误?您可以在这两个阶段获得它们,但我看不到对pgm.link操作的任何检查;pgm.bind;这两行返回true,因此没有链接问题……着色器是堆栈上实例化的对象。它们的引用在初始化后丢失。我没有看到任何漂亮的函数着色器bien chargé?。此代码应该是错误的。
#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.);
}