相关文章推荐
打酱油的香蕉  ·  Excel ...·  6 月前    · 
气势凌人的可乐  ·  mysql中union ...·  11 月前    · 

一种是直观的使用glGetTexImage,然后获取数据到内存再贴上去,这种方法很慢

另一种是使用FBO,将纹理附加到FBO,然后用glCopyTexSubImage2D,不涉及跟内存交换数据,速度飞快。

方法一:获取纹理再拷贝

  1. unsigned char * data = new unsigned char[normal_texture.width*normal_texture.Hight*4];

  2. glBindTexture(GL_TEXTURE_2D,src_id);

  3. glGetTexImage(GL_TEXTURE_2D,0,GL_RGBA,GL_UNSIGNED_BYTE,data);

  4. glBindTexture(GL_TEXTURE_2D,dest_id);

  5. glTexSubImage2D(GL_TEXTURE_2D,0,0,0,width,height,GL_RGBA,GL_UNSIGNED_BYTE,data);

  6. glBindTexture(GL_TEXTURE_2D,0);

第二种方法:FBO拷贝

  1. GLuint fbo;

  2. glGenFramebuffers(1,&fbo);

  3. /// bind the FBO

  4. glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);

  5. /// attach the source texture to the fbo

  6. glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,

  7. GL_TEXTURE_2D, src_id, 0);

  8. /// bind the destination texture

  9. glBindTexture(GL_TEXTURE_2D, dest_id);

  10. /// copy from framebuffer (here, the FBO!) to the bound texture

  11. glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, width,height);

  12. /// unbind the FBO

  13. glBindFramebuffer(GL_FRAMEBUFFER, 0);

  14. glBindTexture(GL_TEXTURE_2D,0);

一种是直观的使用glGetTexImage,然后获取数据到内存再贴上去,这种方法很慢另一种是使用FBO,将纹理附加到FBO,然后用glCopyTexSubImage2D,不涉及跟内存交换数据,速度飞快。方法一:获取纹理再拷贝 unsigned char * data = new unsigned char[normal_texture.width*normal_texture.Hight*4]; glBindTexture(GL_TEXTURE_2D,src_id); . 参考stackoverflow,可行的方法为 一、使用glCopyImag eS ubData,这个方法最直观而且简单。不过需要 OpenGL 4.3 二、为目标texture创建FBO。使用shader,采用texture2D把源texture画到目标texture 三、为源texture创建FBO。使用glCop...
https://www.cnblogs.com/crsky/p/7870835.html 如果你想给游戏做个截图功能,或者想把屏幕图像弄成 一个 纹理 ,你就非常需要 PBO 了 通常情况下,你想把屏幕图像的像素数据读到内存需要用glReadPixels 然后pixels 参数传进去一块内存地址 这样做是非常非常不好的,因为glReadPixels 会把屏幕图像的像素数据从显卡的显存复制到内...
我们知道 OpenGL ES 里面有个函数叫GL ES 20.glReadPixels,可以帮助我们从FrameBuffer里面把 纹理 像素 拷贝 到数组里面,但是这个方法有几个弊端: ①耗时,花费的时间和截图的大小成正比关系,在一些差的设备上耗时非常严重,如果是播放视频,有明显卡顿; ②耗内存,一般截图就是为了把像素数据输出到文件,通常都用Bitmap,这里有个问题是,用Bitmap的话,需要消耗两份内存,创建Bitmap的时候一份,截图时还需要申请一份。 接下来我就针对这两个弊端给出优化的方案。 一.耗时问题的优化 2.画中画场景; 3.游戏中观战模式的多场景场合; 4.镜像场景——比如汽车游戏当中的倒车镜,采用的就是离屏渲染技术,在倒车镜上安装 一个 摄像机,把摄像机渲染的数据保存到FBO(Frame Buffer Object帧缓冲区),再从FBO提取生成 纹理 进行贴图到倒车镜; 2.与实时渲染的优缺点比较: 离屏渲染: 1.在变化的场景下,因为离屏渲染需要创建 一个 新的缓冲区,且需要多次切换上下文环境,所以代价很高; 2.在稳定的场景下,离屏渲染可以采用一张 纹理 进行渲染,所以
一、 纹理 使用三步曲 1、资源:首先你需要一张 纹理 图片,在 OpenGL ES 中的 纹理 图片的尺寸是有要求的,它的高度和宽度必须为2的n次方,比如32x32、256x512等。图片不等于 纹理 ,有了图片,还要经过加工才能当做 纹理 使用。 public int initTexture(GL10 gl,int textureId)//textureId是资源图片的ID int[] text