基于FBO对纹理texture进行拷贝或拉伸处理

博客讲述简单纹理复制需求,原本使用glCopyTexSubImage2D函数执行耗时异常,折腾无果后换成FBO拷贝恢复正常,且FBO还能对画面进行拉伸处理,记录了两种纹理复制方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于简单的纹理复制需求,使用glCopyTexSubImage2D可以实现。不过前段时间碰到一个怪异的现象,glCopyTexSubImage2D()执行耗费了数秒钟才完成,每次如此。折腾了几天也找不着原因。后来换成使用FBO来拷贝就正常。使用FBO还有一个好处就是可以对画面进行拉伸处理。记录如下。

使用glCopyTexSubImage2D函数:

// ...
GLint lastBuffer;
glGetIntegerv(GL_READ_BUFFER, &lastBuffer);
glReadBuffer(GL_COLOR_ATTACHMENT0);  
glBindTexture(pResource->target, pResource->texture);
glCopyTexSubImage2D(pResource->target, 0, 0, 0, 0, 0, width, height);
glBindTexture(pResource->target, 0);
glReadBuffer(lastBuffer);  
// ...

基于FBO和glBlitFramebuffer:

// ...GLuint sourceTex, targetTex;
GLuint rFbo = 0;
GLuint wFbo = 0;

glGenFramebuffers(1, &rFbo);
glBindFramebuffer(GL_READ_FRAMEBUFFER, rFbo);
glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, sourceTex, 0);

glGenFramebuffers(1, &wFbo);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, wFbo);
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, targetTex, 0);

glBlitFramebuffer(0, 0, srcWidth, srcHeight, 0, 0, dstWidth, dstHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST);

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值