有没有人有PBO + SDL2.0 + OpenGL的例子
does anyone have an example of PBO + SDL2.0 + OpenGL
有没有人有PBO(像素缓冲区对象)+ SDL2.0(简单直接媒体层)+ OpenGL的工作示例?
原因是使用GLGetPixel下载异步GPU -> CPU,从而获得性能提升。
这是我的尝试。use_pbo = 假或真根本没有测量差异。我以前在同一台机器上使用过带有 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;
}
尝试将 PBO 绑定到您的纹理
GL_PIXEL_UNPACK_BUFFER用于将像素数据传递到 OpenGL GL_PIXEL_PACK_BUFFER用于从 OpenGL 检索像素数据
您还应该使用 glTexImage2D 定义纹理图像
如果非零命名缓冲区对象绑定到GL_PIXEL_UNPACK_BUFFER目标 (请参阅 glBindBuffer) 而纹理图像 指定时,数据将被视为缓冲区对象数据存储中的字节偏移量。
相关文章:
- SDL2 OpenGL窗口立即关闭
- 用SDL TTF显示带有SDL2和OpenGL的文本
- 用SDL2和OpenGL显示蓝色
- 使用 SDL2 指定 OpenGL 版本
- SDL2要么丢失OpenGL上下文或未定义的函数
- SDL2 OpenGL SDL2_TTF:显示文本
- iOS中的垂直同步(SDL2/OpenGL ES)
- 我的OpenGL和SDL2代码有什么问题
- 如何将opengl 3.3渲染到SDL2纹理中
- SDL2 OpenGL 4.2上下文,具有0个颜色位和0个深度位
- OpenGL 4.1 SDL2 Mac操作系统
- 我是否正在删除 sdl2 和 opengl 正确的 c++
- 有没有人有PBO + SDL2.0 + OpenGL的例子
- 如何使用索引的 PNG 图像作为 SDL2/OpenGL 的纹理
- 如何在 SDL2.0 OpenGL 中调整视口大小
- SDL2 - 检查是否创建了 OpenGL 上下文
- SDL2 主滴答系统(openGL)
- SDL2 + OpenGL = Gnome 3 错误地抱怨"Program not responding"
- Android NDK SDL2 OpenGL ES 2 影子映射(定向)- 是否可能
- OpenGL/SDL2双深度缓冲