Чтение значений пикселей из объекта буфера кадров (FBO) с помощью объекта буфера пикселей (PBO)
могу ли я использовать объект буфера пикселей (PBO) для прямого считывания значений пикселей (т. е. с помощью glReadPixels) из FBO (т. е. пока FBO все еще подключен)?
Если да,
- каковы преимущества и недостатки использования PBO с FBO?
- в чем проблема со следующим кодом
{
//DATA_SIZE = WIDTH * HEIGHT * 3 (BECAUSE I AM USING 3 CHANNELS ONLY)
// FBO and PBO status is good
.
.
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId);
//Draw the objects
после glReadPixels работает отлично
glReadPixels(0, 0, screenWidth, screenHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, (uchar*)cvimg->imageData);
после glReadPixels НЕ РАБОТАЕТ: (
glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pboId);
//yes glWriteBuffer has also same target and I also checked with every possible values
glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
glReadPixels(0, 0, screenWidth, screenHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, (uchar*)cvimg->imageData);
.
.
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); //back to window framebuffer
2 ответов
при использовании PBO в качестве цели для glReadPixels
вы должны указать смещение байта в буфер (0
, Я полагаю) вместо (uchar*)cvimg->imageData
в качестве целевого адреса. Это похоже на использование смещения буфера в glVertexPointer
при использовании VBOs.
EDIT: когда PBO привязан к GL_PIXEL_PACK_BUFFER
последний аргумент glReadPixels
рассматривается не как указатель на системную память, а как смещение байта в память связанного буфера. Поэтому для записи пикселей в буфер просто передайте 0 (write их до начала буферной памяти). Затем вы можете позже получить доступ к буферной памяти (чтобы получить пиксели) с помощью glMapBuffer
. Пример ссылки, которую вы предоставили в своем комментарии, также делает это, просто прочитайте ее широко. Я также предлагаю прочитать часть о вершинных буферных объектах, которые они упоминают в начале, поскольку они закладывают основу для понимания буферных объектов.
Да, мы можем использовать FBO и PBO вместе.
ответ 1:
для синхронного чтения: 'glReadPixels' без PBO быстро.
для асинхронного чтения: 'glReadPixels' с 2 / n PBOs лучше-один для чтения пикселей из фреймбуффера в PBO (n) с помощью GPU и другой PBO (n+1) для обработки пикселей с помощью CPU. Однако быстро не предоставляется, это проблема и дизайн spefic.
ответ 2:
объяснение Кристиана Рау правильное, а пересмотренный код ниже
glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pboId);
glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
//glReadBuffer(GL_DEPTH_ATTACHMENT_EXT);
glReadPixels(0, 0, screenWidth, screenHeight, GL_BGR, GL_UNSIGNED_BYTE, 0);
//GLubyte* src = (GLubyte*)glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY_ARB);
//OR
cvimg->imageData = (char*) glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY_ARB);
if(cvimg_predict_contour->imageData)
{
//Process src OR cvim->imageData
glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB); // release pointer to the mapped buffer
}
glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);