簡體   English   中英

OpenGL:讀取顏色緩沖區

[英]OpenGL : reading color buffer

我將4個顏色緩沖區附加到一個幀緩沖區,並在每個緩沖區中進行渲染。 每個顏色緩沖區都有窗口的大小。 我正在嘗試使用鼠標指針的坐標讀取這些顏色緩沖區之一的像素的顏色。

鼠標移動事件處理程序

void mouseMoveEvent(QMouseEvent *event)
{
    int x = event->pos().x();
    int y = event->pos().y();

    makeCurrent();
    glBindFramebuffer(GL_READ_FRAMEBUFFER, FBOIndex::GEOMETRY);
    {
        // I save the values I'm interested in in the attachment GL_COLOR_ATTACHMENT3
        // but I always get 0 from any other attachment I try
        glReadBuffer(GL_COLOR_ATTACHMENT3);

        QVector<GLubyte> pixel(3);
        glReadPixels(x, geometry().height() - y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, &(pixel[0]));

        QString PixelColor = QColor(pixel[0], pixel[1], pixel[2]).name();    
        qDebug() << PixelColor; // => always 0
    }
    glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebufferObject());
    doneCurrent();
}

但是對於每個顏色緩沖區,我總是讀取值0。

顏色緩沖區在渲染階段正確寫入,我通過顯示它們所附着的紋理來測試了每個顏色緩沖區。 我還測試了由鼠標指針選擇的指向默認幀緩沖區的像素讀數,它可以正常工作。

我哪里錯了? 謝謝!

編輯

看起來很奇怪的是,如果使用“專用”幀緩沖區,則可以正確讀取存儲在紋理中的值。

void mouseMoveEvent(QMouseEvent *event)
{
    int x = event->pos().x();
    int y = event->pos().y();

    GLuint fbo;

    makeCurrent();
    glGenFramebuffers(1, &fbo);
    glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    {
        GLuint texture = textures[TextureIndex::COLOUR];
        glBindTexture(GL_TEXTURE_2D, texture);
        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);

        QVector<GLubyte> pixel(3);
        glReadPixels(x, geometry().height() - y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, &(pixel[0]));

        QString PixelColor = QColor(pixel[0], pixel[1], pixel[2]).name();
        qDebug() << PixelColor; // => correct value
    }
    glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebufferObject());
    glDeleteFramebuffers(1, &fbo);
    doneCurrent();
}

但是很明顯,當我已經有了一個包含我所需信息的幀緩沖區時,使用另一個幀緩沖區似乎毫無用處。

我還嘗試直接讀取紋理的值(如@Spektre所建議),但在這種情況下,我總是得到0。

void mouseMoveEvent(QMouseEvent *event)
{
    int x = event->pos().x();
    int y = event->pos().y();

    makeCurrent();
    {
        GLuint texture = textures[TextureIndex::COLOUR];
        glBindTexture(GL_TEXTURE_2D, texture);
        glTexSubImage2D(GL_TEXTURE_2D, 0, x, geometry().height() - y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, &(pixel[0]));

        QString PixelColor = QColor(pixel[0], pixel[1], pixel[2]).name();
        qDebug() << PixelColor; // => always 0
    }
    doneCurrent();
}

我的方法是正確的,但是我沒有綁定到正確的幀緩沖區。

FBOIndex::GEOMETRY是我用來索引FBOs數組的枚舉值,在該數組中我存儲了所有幀緩沖對象名稱,因此通常它不是正確的幀緩沖對象名稱。

我定義了一個方法addFBO(index) ,它創建一個幀緩沖區並將其存儲在FBOs數組中的位置index 該方法返回生成的幀緩沖區的幀緩沖區對象名稱。 如果在位置index處已經存在一個幀緩沖區,則該方法僅返回關聯的幀緩沖區對象名稱。

因此,通過以以下方式更改代碼,我終於獲得了期望的結果。

void mouseMoveEvent(QMouseEvent *event)
{
    int x = event->pos().x();
    int y = event->pos().y();

    makeCurrent();
    glBindFramebuffer(GL_READ_FRAMEBUFFER, addFBO(FBOIndex::GEOMETRY));
    {
        glReadBuffer(GL_COLOR_ATTACHMENT3);

        QVector<GLubyte> pixel(3);
        glReadPixels(x, geometry().height() - y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, &(pixel[0]));

        QString PixelColor = QColor(pixel[0], pixel[1], pixel[2]).name();    
        qDebug() << PixelColor; // => correct value
    }
    glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebufferObject());
    doneCurrent();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM