有没有人有PBO + SDL2.0 + OpenGL的例子

时间:2013-11-14 11:58:57

标签: c++ opengl sdl-2 pbo

有没有人有PBO(像素缓冲对象)+ SDL2.0(简单直接媒体层)+ OpenGL的工作示例?

原因是获得异步GPU - >使用GLGetPixels下载CPU,从而提高性能。

这是我的尝试。 use_pbo = false或true没有任何测量差异。我之前在同一台机器上使用过带有GLUT的PBO,所以我知道我的硬件支持它。

我在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 个答案:

答案 0 :(得分:0)

尝试将PBO绑定到纹理

GL_PIXEL_UNPACK_BUFFER用于传递到OpenGL GL_PIXEL_PACK_BUFFER的像素数据,用于从OpenGL 检索的像素数据

您还应该使用glTexImage2D

定义纹理图像
  

如果非零命名缓冲区对象绑定到GL_PIXEL_UNPACK_BUFFER目标               (见glBindBuffer)纹理图像是               指定的数据被视为缓冲区对象的数据存储中的字节偏移量。