QGrapicsView で OpenGL シェーダーを使用しようとしています。私のグラフィック カードは NVidia GeForce GT 425M です。NVidia ドライバー 295.40 を使用して Ubuntu 12.04 で実験を行いました。
2 つの QGraphicsView を含む QMainWindow を作成します。各グラフィック ビューには同じシーンが表示されます。グラフィック ビューの 1 つで、OpenGL ビュー ポートをセットアップします。OpenGL ビュー ポートは、頂点シェーダー プログラムとフラグメント シェーダー プログラムのロードでオーバーロードした 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.);
}
そのため、(フラグメント シェーダーで) ピクセルを強制的に赤くしたと思うので、Shaded Graphics ビューを大きな赤い四角として表示しようとしました。
シェーダーのコンパイル エラーはありませんが、2 つのシーンは同じです。もちろん、プログラムは initializeGL 関数に渡します ( PRETTY_FUNCTIONを読み取ることができます)。
説明がありますか?