Не умеет писать ПБО в текстуру - PullRequest
0 голосов
/ 24 октября 2019

Я хочу записать данные моего буфера кадров в PBO, а затем записать их обратно в текстуру.

По сути, это тестовое упражнение.

Я создаю Framebuffer и прикрепляютекстура и прикрепление к нему буфера рендеринга.

Я могу создать текстуру буфера кадров и сопоставить ее с прямоугольником.

Далее я пытаюсь прочитать пиксели буфера кадров вPBO и затем попытайтесь создать объект текстуры.

Создайте PBO

    // create a color attachment texture
     unsigned int texture;
     glGenTextures(1, &texture);
     glBindTexture(GL_TEXTURE_2D, texture);
      glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, SCR_WIDTH, SCR_HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, 
 NULL);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);


    int readIndex = 0;
    int writeIndex = 1;
    GLuint pbo[2];

    // create PBOs to hold the data. this allocates memory for them too
    glGenBuffers(2, pbo);
    glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo[0]);
    glBufferData(GL_PIXEL_PACK_BUFFER, SCR_WIDTH *SCR_HEIGHT * 3, 0, GL_STREAM_READ);
    glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo[1]);
    glBufferData(GL_PIXEL_PACK_BUFFER, SCR_WIDTH *SCR_HEIGHT * 3, 0, GL_STREAM_READ);
    // unbind buffers for now
    glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);

В цикле рендеринга

    glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);  // Bind the framebuffer
     // Draw Elements
     /*            */

    glReadBuffer(framebuffer);
    writeIndex = (writeIndex + 1) % 2;
    readIndex = (writeIndex + 1) % 2;
    // bind PBO to read pixels. This buffer is being copied from GPU to CPU memory
    glBindTexture(GL_TEXTURE_2D, texture);

    glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo[writeIndex]);
    // copy from framebuffer to PBO asynchronously. it will be ready in the NEXT frame
    glReadPixels(0, 0, SCR_WIDTH, SCR_HEIGHT, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
    // now read other PBO which should be already in CPU memory
    glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo[readIndex]);
    // map buffer so we can access it
    void* downsampleData = (unsigned char *)glMapBuffer(GL_PIXEL_PACK_BUFFER,GL_READ_ONLY);


    if (downsampleData)
    {

        glTexSubImage2D(GL_TEXTURE_2D, 0, GL_RGB, SCR_WIDTH, SCR_HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, downsampleData);
        // clear all relevant buffers           
        downsampleData = nullptr;
        glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
        glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
    }

    // now bind back to default framebuffer and draw a quad plane with the attached texture updated from the PBO.

    // Now render in NDC with a Quad covering full screen.
    glBindFramebuffer(GL_FRAMEBUFFER, 0);
    glDisable(GL_DEPTH_TEST); // disable depth test so screen-space quad isn't discarded due to depth test.
    // clear all relevant buffers
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f); // set clear color to white (not really necessery actually, since we won't be able to see behind the quad anyways)
    glClear(GL_COLOR_BUFFER_BIT);

    screenShader.use();
    glBindVertexArray(quadVAO);
    glBindTexture(GL_TEXTURE_2D, texture);
    glDrawArrays(GL_TRIANGLES, 0, 6);

Результирующая текстура черного цвета.

1 Ответ

0 голосов
/ 24 октября 2019

Этот код работает теперь после внесения следующих изменений

if (downsampleData)
        {
            glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo[writeIndex]); // Needed to add this line. 
            glTexSubImage2D(GL_TEXTURE_2D, 0,0,0, SCR_WIDTH, SCR_HEIGHT, GL_RGB, GL_UNSIGNED_BYTE, 0); // changed from the  pointer name to 0.
            // clear all relevant buffers           
            downsampleData = nullptr;
            glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
            glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...