2

Qt3D を使用し、QGLView を使用して複雑な 3D シーンを描画します。

このシーン内の QGLNodeにいくつかのウィジェットを描画する必要がありますが、方法がわかりません。

これは、私がやろうとしていることの最小限の例です(qt3dの「ネスト」デモに基づいています):

ヘッダ:

class CubeView : public QGLView
{
    Q_OBJECT
    Q_PROPERTY(qreal cubeAngle READ cubeAngle WRITE setCubeAngle)

public:
    CubeView(QWidget *parent = 0);
    ~CubeView();

    qreal cubeAngle() const { return cangle; }
    void setCubeAngle(qreal angle) { cangle = angle; update(); }

protected:
    void initializeGL(QGLPainter *painter);
    void paintGL(QGLPainter *painter);

private:
    QGLSceneNode *scene;
    QGLSceneNode *cube;
    QGLFramebufferObject *fbo;
    QGLFramebufferObjectSurface fboSurface;
    QGLCamera *innerCamera;
    qreal cangle;

    void drawCube(QGLPainter* painter);
    void drawFrameBuffer();
};

初期化中:

void CubeView::initializeGL(QGLPainter *)
{
    fbo = new QGLFramebufferObject(512, 512);
    fboSurface.setFramebufferObject(fbo);
}

塗装コード:

void CubeView::paintGL(QGLPainter *painter)
{
    painter->modelViewMatrix().push();
    painter->projectionMatrix().push();

#ifdef DRAW_GLNODE
    painter->pushSurface(&fboSurface);
#endif

    painter->setCamera(innerCamera);
    painter->modelViewMatrix().rotate(cangle, 0.0f, 1.0f, 0.0f);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

#ifdef DRAW_GLNODE
    cube->draw(painter);
#else
    QPushButton button;
    button.resize(fbo->width(), fbo->height());
    button.render(fbo); // filling QGLFrameBuffer
#endif

    drawFrameBuffer(); // debug QPixmap with QGLFrameBuffer data

#ifdef DRAW_GLNODE
    painter->popSurface();
#endif

    painter->projectionMatrix().pop();
    painter->modelViewMatrix().pop();

    drawCube(painter);
}

立方体の描画:

void CubeView::drawCube(QGLPainter *painter)
{
    painter->modelViewMatrix().push();

    painter->modelViewMatrix().rotate(cangle, 1.0f, 1.0f, 1.0f);

    painter->setStandardEffect(QGL::LitDecalTexture2D);

    glBindTexture(GL_TEXTURE_2D, fbo->texture());
    glEnable(GL_TEXTURE_2D);

    cube->draw(painter);

    glBindTexture(GL_TEXTURE_2D, 0);
    glDisable(GL_TEXTURE_2D);

    painter->modelViewMatrix().pop();
}

「#define DRAW_GLNODE」がアクティブな場合、回転する立方体が別の立方体内のテクスチャとして表示されます (左側のウィンドウにフレーム バッファ データが表示されます)。

http://i.stack.imgur.com/Ok4NT.png

「#define 0」に切り替えると、QGLView に黒い画面が表示されますが、ご覧のとおり、QGLFrameBuffer にはデータが含まれています。

http://i.stack.imgur.com/5R6Wz.png

私は何を間違っていますか?

4

0 に答える 0