2013-05-05 105 views
0

我試圖渲染兩個紋理,從第一個繪製到第二個,然後從第二到第一等的問題是,當我渲染第一個紋理到第二個,它工作正常,但渲染第二個到第一個紋理,當它應該是一個紫色紋理時。我正在使用Qt和OpenGL。的OpenGL平與兩個紋理上同樣的framebuffer ponging

兩個紋理綁定到同一個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(); 
} 

我應該得到一個藍色屏幕的中心紫四,而不是我得到在中央的白色四。我在這裏做錯了什麼?

回答

1

我看到你的代碼的幾個地方,您設置的活動紋理。但是,設置活動紋理指什麼只要程序將拉什麼紋理單元。這取決於紋理圖像單元設置爲訪問紋理的採樣器統一體。您需要更改該制服,而不是活動紋理。

或者更好的,只是綁定其它質地上下文。不需要設置活動紋理圖像單元;只是綁定你想要的樣本。真的,有一個在任何你正在做的glActiveTexture呼叫沒有任何意義。