一种是直观的使用glGetTexImage,然后获取数据到内存再贴上去,这种方法很慢
另一种是使用FBO,将纹理附加到FBO,然后用glCopyTexSubImage2D,不涉及跟内存交换数据,速度飞快。
方法一:获取纹理再拷贝
-
unsigned char * data = new unsigned char[normal_texture.width*normal_texture.Hight*4];
-
glBindTexture(GL_TEXTURE_2D,src_id);
-
glGetTexImage(GL_TEXTURE_2D,0,GL_RGBA,GL_UNSIGNED_BYTE,data);
-
glBindTexture(GL_TEXTURE_2D,dest_id);
-
glTexSubImage2D(GL_TEXTURE_2D,0,0,0,width,height,GL_RGBA,GL_UNSIGNED_BYTE,data);
-
glBindTexture(GL_TEXTURE_2D,0);
第二种方法:FBO拷贝
-
GLuint fbo;
-
glGenFramebuffers(1,&fbo);
-
/// bind the FBO
-
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
-
/// attach the source texture to the fbo
-
glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
-
GL_TEXTURE_2D, src_id, 0);
-
/// bind the destination texture
-
glBindTexture(GL_TEXTURE_2D, dest_id);
-
/// copy from framebuffer (here, the FBO!) to the bound texture
-
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, width,height);
-
/// unbind the FBO
-
glBindFramebuffer(GL_FRAMEBUFFER, 0);
-
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