0

2 つのテクスチャにレンダリングしようとしています。最初のテクスチャから 2 番目にレンダリングし、次に 2 番目から最初のテクスチャにレンダリングします。問題は、最初のテクスチャを 2 番目にレンダリングすると正常に動作するが、最初の 2 番目は、紫色のテクスチャであるはずのときに、白いテクスチャを残します。Qt と OpenGL を使用しています。

両方のテクスチャは同じ FBO にバインドされており、glDrawBuffer(GL_COLOR_ATTACHMENT_i) を使用してそれらを切り替えています。

ここに私の初期化コードがあります:

void GlWidget::initializeGL() {
    glewInit();
    src = true;
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_TEXTURE_2D);
    //glEnable(GL_CULL_FACE);

// Generate the texture to be drawn
    tex = new float[256*256*4];
    for(int i = 0; i < 256*256*4; i++){
        if (i % 4 == 0){
            tex[i] = 0.5;
        }else if (i % 4 == 1){
            tex[i] = 0.3;
        }else if (i % 4 == 2){
            tex[i] = 0.5;
        }else if (i % 4 == 3){
            tex[i] = 0;
        }
    }



    glGenTextures(1, &texture);
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, texture);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 256, 256, 0,  GL_RGBA, GL_FLOAT, tex);

    glGenTextures(1, &targetTex);
    glActiveTexture(GL_TEXTURE1);
    glBindTexture(GL_TEXTURE_2D, targetTex);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 256, 256, 0,  GL_RGBA, GL_FLOAT, NULL);

    glGenFramebuffers(1, &fb);
    glBindFramebuffer(GL_FRAMEBUFFER, fb);
    //Attach 2D texture to this FBO
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, targetTex, 0);
    glDrawBuffer (GL_COLOR_ATTACHMENT1);
    //-------------------------
    glGenRenderbuffers(1, &depth_rb);
    glBindRenderbuffer(GL_RENDERBUFFER_EXT, depth_rb);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, 256, 256);

    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER, depth_rb);
    glBindFramebuffer(GL_FRAMEBUFFER, 0);

    shaderProgram.addShaderFromSourceFile(QGLShader::Vertex, ":/vertexShader.vsh");
    shaderProgram.addShaderFromSourceFile(QGLShader::Fragment, ":/fragmentShader.fsh");
    shaderProgram.link();
    vertices << QVector3D(-1, -1, -2) << QVector3D(-1, 1, -2) << QVector3D(1, 1, -2) << QVector3D(1, -1, -2);
    texCoords << QVector2D(0, 0) << QVector2D(0, 1) <<  QVector2D(1, 1) << QVector2D(1, 0);
}

そして、ここに私の描画コードがあります:

void GlWidget::render_to_screen () {
    glBindFramebuffer(GL_FRAMEBUFFER, 0);

    qglClearColor(QColor(Qt::blue));
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    if(src){
        glActiveTexture(GL_TEXTURE0);
    }else{
        glActiveTexture(GL_TEXTURE1);
    }

    shaderProgram.enableAttributeArray("textureCoordinates");
    shaderProgram.enableAttributeArray("vertex");

    glDrawArrays(GL_QUADS, 0, vertices.size());
    shaderProgram.disableAttributeArray("vertex");
    shaderProgram.disableAttributeArray("textureCoordinates");
}

void GlWidget::paintGL()
{
    qDebug() << "Updating";
    glBindFramebuffer(GL_FRAMEBUFFER, fb);
    if(src) {
        glDrawBuffer(GL_COLOR_ATTACHMENT1);
        glActiveTexture(GL_TEXTURE0);
    }else {
        glDrawBuffer(GL_COLOR_ATTACHMENT0);
        glActiveTexture(GL_TEXTURE1);
    }
    src = !src;
    qglClearColor(QColor(Qt::white));
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    QMatrix4x4 mMatrix;
    QMatrix4x4 vMatrix;


    shaderProgram.bind();

    shaderProgram.setUniformValue("mvpMatrix", pMatrix * vMatrix * mMatrix);
    shaderProgram.setAttributeArray ("textureCoordinates", texCoords.constData ());
    shaderProgram.enableAttributeArray("textureCoordinates");
    shaderProgram.setAttributeArray("vertex", vertices.constData());
    shaderProgram.enableAttributeArray("vertex");

    glDrawArrays(GL_QUADS, 0, vertices.size());

    shaderProgram.disableAttributeArray("vertex");
    shaderProgram.disableAttributeArray("textureCoordinates");
    render_to_screen ();
    shaderProgram.release();
}

中央に紫色のクワッドがある青い画面が表示されるはずですが、中央に白いクワッドが表示されます。ここで何が間違っていますか?

4

1 に答える 1

1

あなたのコードには、アクティブなテクスチャを設定する場所がいくつかあります。ただし、アクティブなテクスチャを設定しても、プログラムがどのテクスチャ ユニットから取得するかについては意味がありません。これは、テクスチャにアクセスしているサンプラ ユニフォームに設定されたテクスチャ イメージ ユニットによって決定されます。アクティブなテクスチャではなく、そのユニフォームを変更する必要があります。

または、他のテクスチャをコンテキストにバインドするだけです。アクティブなテクスチャ イメージ ユニットを設定する必要はありません。サンプリングしたいテクスチャをバインドするだけです。本当に、glActiveTextureあなたがしている電話には意味がありません。

于 2013-05-05T14:23:58.580 に答える