1

QT 4.7 と QGLWidget を使用して、QGLWidget::paintGL() を使用してシーンを QGLFramebufferObject にレンダリングし、QGLFramebufferObject によって生成されたテクスチャを使用して画面に表示します。2 番目のステップでは、正投影でフルスクリーンのクワッドをレンダリングし、独自のシェーダーを使用してテクスチャをレンダリングします。

QGLFramebufferObject へのレンダリングは正常に動作しているようです (少なくとも QGLFramebufferObject::toImage().save(filename) を呼び出すことができ、正しくレンダリングされた画像を取得できます) が、レンダリングされたテクスチャを画面に描画することはできません。

フレームバッファ オブジェクトにレンダリングするために使用するコードは次のとおりです。

    //Draw into framebufferobject
    _fbo->bind();
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    _camera->applyModelviewMatrix();
    _scene->glDraw();
    glFlush();
    _fbo->release();
    _fbo->toImage().save("image.jpg");

前述のように、ここに保存された画像には正しくレンダリングされた画像が含まれています。

ここで、フレームバッファ オブジェクトを画面にレンダリングしようとするコードを示します。独自のシェーダーを使用してレンダリングしています。

    //Draw framebufferobject to a full-screen quad on the screen
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0,1.0,0.0,1.0,-1.0,1.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glEnable(GL_TEXTURE_2D);
    _selectionShader->bind();
    glBindTexture(GL_TEXTURE_2D, _fbo->texture());
    _selectionShader->setUniformValue("renderedTexture", _fbo->texture());

    glBegin(GL_QUADS);
        glTexCoord2f(0.0,0.0);
        glVertex3f(0.0f,0.0f,0.0f);
        glTexCoord2f(1.0,0.0);
        glVertex3f(1.0f,0.0f,0.0f);
        glTexCoord2f(1.0,1.0);
        glVertex3f(1.0f,1.0f,0.0f);
        glTexCoord2f(0.0,1.0);
        glVertex3f(0.0f,1.0f,0.0f);
    glEnd();
    glDisable(GL_TEXTURE_2D);
    glFlush();
}

頂点シェーダーは、テクスチャ座標として使用する位置を単純に通過します。

varying vec2 position;

void main()
{
    gl_Position = ftransform();
    position = gl_Vertex.xy;
}

そしてフラグメントシェーダーがテクスチャーを描画

varying vec2 position;
uniform sampler2D renderedTexture;

void main()
{
    gl_FragColor = texture2D(renderedTexture, position);
}

私が行っている投影は正しいです。フラグメント シェーダーを次のものと交換すると、予想される色のグラデーションが描画されます。

varying vec2 position;
uniform sampler2D renderedTexture;

void main()
{
    gl_FragColor = vec4(position.x, 0.0f, position.y, 1.0f);
}

しかし、テクスチャをレンダリングする必要がある他のフラグメントシェーダーを使用すると、空白の画面しか表示されません (レンダリングの開始時に glClear() によって空白にされました)。そのため、フラグメント シェーダーは黒を描画するか、何も描画しないように見えます。

何か不足していますか?テクスチャを正しくシェーダーに渡していますか? テクスチャを準備するために他に何かする必要がありますか?

4

1 に答える 1

2
_selectionShader->setUniformValue("renderedTexture", _fbo->texture());

これは(または)間違った部分です。シェーダのサンプラ ユニフォームは、テクスチャ オブジェクトではなく、このオブジェクトがテクスチャとしてバインドされているテクスチャ ユニットに設定されます (既に で行っていますglBindTexture(GL_TEXTURE_2D, _fbo->texture())。したがって、GL_TEXTURE0常に使用しているように見えるので、 texture unit に設定するだけです0:

_selectionShader->setUniformValue("renderedTexture", 0);

ちなみに、glEnable(GL_TEXTURE_2D)シェーダーを使用する場合は必要ありません。glTexCoord2fとにかく頂点位置をテクスチャ座標として使用しているのに、なぜ使用するのでしょうか?

于 2013-11-13T12:13:25.307 に答える