您当前的位置: 首页 > 

鱼儿-1226

暂无认证

  • 0浏览

    0关注

    1100博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

OpenGL---PBO

鱼儿-1226 发布时间:2020-08-11 10:24:42 ,浏览量:0

PBO(Pixel Buffer Object),将像素数据存储在显存中。

 

优点:

1、快速的像素数据传递,它采用了一种叫DMA(Direct Memory Access)的技术,无需CPU介入

2、 高效并不在于传输更快,而在于与硬件相关的异步调用方式,调用之后CPU即返回执行其它操作(使用DMA方式的传输、由OpenGL直接控制)

3、在单个PBO情况下并不能得到很好的效果,毕竟传输过程仍然存在(但速度可能变快,比如显存内部的数据传输),但其异步性就提供了双PBO实现的可能性,用双PBO来进行加速

左图是传统的加载一个纹理的示意图,可以看到,首先将纹理图像读到内存,然后再从内存拷贝到纹理对象中,这两个过程均需CPU的参与;而右图采用了PBO加载纹理,首先将像素数据加载到PBO中,然后通过DMA方式传送到纹理对象,最后一步不需要CPU参与。

 

创建PBO:

   1. 用glGenBuffersARB()生成缓存对象;    2. 用glBindBufferARB()绑定缓存对象;    3. 用glBufferDataARB()将像素数据拷贝到缓存对象。

 

映射PBO:

    void* glMapBufferARB(GLenum target, GLenum access);     GLboolean glUnmapBufferARB(GLenum target);      

  

几个参数的释疑:

    GL_PIXEL_PACK_BUFFER_ARB 将像素数据传给PBO     GL_PIXEL_UNPACK_BUFFER_ARB 从PBO得到像素数据

     比如说,glReadPixel就是从帧缓存中读取数据,写到PBO中,可理解为“pack”;glDrawPixel是从PBO中读取数据,写到到帧缓存,可理解为“unpack”;glGetTexImage是从纹理对象到PBO,可理解为“pack”;glTexImage2d从PBO写到纹理对象(texture object),可理解为“unpack”。

 

 

[cpp] view plaincopy

  1. #include   
  2. #include   
  3. #include   
  4. using namespace std;  
  5.   
  6.   
  7. GLuint pboIds[2];      
  8. GLuint textureId;   // Storage For 6 face Textures   
  9.   
  10. //camera  
  11. float cameraAngleX;  
  12. float cameraAngleY;  
  13. float cameraDistance = -5.0;  
  14.   
  15. //mouse  
  16. bool mouseLeftDown;  
  17. bool mouseRightDown;  
  18. float LastXPos;  
  19. float LastYPos;  
  20.   
  21. const int    IMAGE_WIDTH = 1024;  
  22. const int    IMAGE_HEIGHT = 1024;  
  23. const int    CHANNEL_COUNT = 4;  
  24. const int    DATA_SIZE = IMAGE_WIDTH * IMAGE_HEIGHT * CHANNEL_COUNT;  
  25.   
  26. GLubyte* imageData = 0;   
  27.   
  28.   
  29. void initGL()  
  30. {  
  31.   
  32.     glEnable(GL_TEXTURE_2D);       // Enable Texture Mapping  
  33.     glShadeModel(GL_SMOOTH);       // Enable Smooth Shading  
  34.     glClearColor(0.0f, 0.0f, 0.0f, 0.5f);    // Black Background  
  35.   
  36.     glGenTextures(1, &textureId);  
  37.     glBindTexture(GL_TEXTURE_2D, textureId);  
  38.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);  
  39.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);  
  40.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);  
  41.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);  
  42.     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, IMAGE_WIDTH, IMAGE_HEIGHT, 0, GL_BGRA, GL_UNSIGNED_BYTE, (GLvoid*)imageData);  
  43.     glBindTexture(GL_TEXTURE_2D, 0);  
  44.   
  45.     glGenBuffers(2, pboIds);  
  46.     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pboIds[0]);  
  47.     glBufferData(GL_PIXEL_UNPACK_BUFFER, DATA_SIZE, 0, GL_STREAM_DRAW);  
  48.     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pboIds[1]);  
  49.     glBufferData(GL_PIXEL_UNPACK_BUFFER, DATA_SIZE, 0, GL_STREAM_DRAW);  
  50.     glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);  
  51. }  
  52.   
  53. void updatePixels(GLubyte* dst, int size)  
  54. {  
  55.     static int color = 0;  
  56.   
  57.     if(!dst)  
  58.         return;  
  59.   
  60.     int* ptr = (int*)dst;  
  61.   
  62.     // copy 4 bytes at once  
  63.     for(int i = 0; i 
关注
打赏
1604459285
查看更多评论
立即登录/注册

微信扫码登录

0.0457s