у кого-нибудь есть пример PBO + SDL2.0 + OpenGL

Есть ли у кого-нибудь рабочий пример PBO (Pixel Buffer Objects) + SDL2.0 (Simple DirectMedia Layer) + OpenGL?

Причина в том, чтобы получить асинхронную загрузку GPU -> CPU с помощью GLGetPixels и, таким образом, повысить производительность.

Вот моя попытка. Там нет никакой измеренной разницы вообще с use_pbo = false или true. И раньше я использовал PBO с GLUT на той же машине, так что я знаю, что мое оборудование поддерживает это.

Я много смотрел на http://www.songho.ca/opengl/gl_pbo.html учебник, но не вижу, что я делаю что-то не так.

bool use_pbo = true; //remember to wait a bit for fps to pick up speed

if(SDL_Init(SDL_INIT_EVENTS) != 0) throw "SDL_Init";

SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);

sdl_window = SDL_CreateWindow("", 10, 20, window_width, window_height, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);

sdl_gl_context = SDL_GL_CreateContext(sdl_window);
SDL_GL_MakeCurrent(sdl_window, sdl_gl_context);

vertical_sync(false);

{
glGenBuffers(2, pbos);
glBindBuffer(GL_PIXEL_PACK_BUFFER, pbos[0]);
glBufferData(GL_PIXEL_PACK_BUFFER, pbo_width*pbo_height*4, 0, GL_STREAM_READ);

glBindBuffer(GL_PIXEL_PACK_BUFFER, pbos[1]);
glBufferData(GL_PIXEL_PACK_BUFFER, pbo_width*pbo_height*4, 0, GL_STREAM_READ);

glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
}

//render to default frame buffer
{
glDrawBuffer(GL_BACK);

glClearColor(0.1, 0.2, 0.3, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

glUseProgram(simple_shader);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, transparent_texture);

glBegin(GL_TRIANGLE_STRIP);
//textcoord, color, position
glVertexAttrib2f(2, 0, 1); glVertexAttrib4f(1, 1, 0, 0, 1); glVertexAttrib2f(0, -1, -1); //bottom left
glVertexAttrib2f(2, 1, 1); glVertexAttrib4f(1, 0, 1, 0, 1); glVertexAttrib2f(0, +1, -1); //bottom right
glVertexAttrib2f(2, 0, 0); glVertexAttrib4f(1, 0, 0, 1, 1); glVertexAttrib2f(0, -1, +1); //top left
glVertexAttrib2f(2, 1, 0); glVertexAttrib4f(1, 1, 1, 0, 1); glVertexAttrib2f(0, +1, +1); //top right
glEnd();

glBindTexture(GL_TEXTURE_2D, 0);

glUseProgram(0);

glDisable(GL_BLEND);

while(true)
{
if(use_pbo)
{
glBindBuffer(GL_PIXEL_PACK_BUFFER, pbos[1]);
GLvoid* map_buffer_data = glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);

if(map_buffer_data)
{
//glRasterPos2i(-1, -1); //default, left bottom
glRasterPos2i(0, -1);
glDrawPixels(pbo_width, pbo_height, GL_BGRA, GL_UNSIGNED_BYTE, map_buffer_data);
glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
}

glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
}
else
{
glRasterPos2i(0, -1); //right bottom
glDrawPixels(pbo_width, pbo_height, GL_BGRA, GL_UNSIGNED_BYTE, t.c);
}
}
}

SDL_GL_SwapWindow(sdl_window);

//cycle buffers
{
GLuint t = pbos[1];
pbos[1] = pbos[0];
pbos[0] = t;
}

-1

Решение

Попробуйте привязать PBO к вашей текстуре

GL_PIXEL_UNPACK_BUFFER для данных пикселей прошло в OpenGL GL_PIXEL_PACK_BUFFER для данных пикселей извлекаться от OpenGL

Также вы должны определить текстуру изображения с glTexImage2D

Если объект буфера с ненулевым именем связан с целью GL_PIXEL_UNPACK_BUFFER
(см. glBindBuffer) в то время как изображение текстуры
указано, данные обрабатываются как смещение байта в хранилище данных объекта буфера.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]