FBO进行多纹理拼接
2016-03-14 13:57
603 查看
有个需求,要将多张纹理拼接到一张,可以设定拼接区域;
由于OGLES2.0,不支持glReadBudder(), glblitframebuffer().
就考虑采用Render to Texture的方式
(1)创建一张空Texture用于保存最终结果 defualtTex。
glGenTextures(1, &defualtTex);
glBindTexture(GL_TEXTURE_2D, defualtTex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, a_iWidth, a_iHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
(2)初始化FBO
glGenFramebuffers(1, &m_fbo);
glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,defualtTex, 0);
// now got back to the default render context
glBindFramebuffer(GL_FRAMEBUFFER, 0);
(3)每次往FBO指定区域绘制一次纹理
//以下根据需求多次调用
glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_TesTex.GetTextureID(), 0);
Draw(tex);// 此处为绘制的纹理,
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
(4)这样多张纹理就绘制到defualtTex中了,可以保存出来,也可以直接作为纹理渲染显示
unsigned char* output_image = new unsigned char[M_WIDTH * M_HEIGHT * 3];
glBindTexture(GL_TEXTURE_2D,defualtTex);
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGB, GL_UNSIGNED_BYTE, output_image);
此时output_image保存了defualtTex中的数据,可以保存出看
代码稍后上传~
由于OGLES2.0,不支持glReadBudder(), glblitframebuffer().
就考虑采用Render to Texture的方式
(1)创建一张空Texture用于保存最终结果 defualtTex。
glGenTextures(1, &defualtTex);
glBindTexture(GL_TEXTURE_2D, defualtTex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, a_iWidth, a_iHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
(2)初始化FBO
glGenFramebuffers(1, &m_fbo);
glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,defualtTex, 0);
// now got back to the default render context
glBindFramebuffer(GL_FRAMEBUFFER, 0);
(3)每次往FBO指定区域绘制一次纹理
//以下根据需求多次调用
glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_TesTex.GetTextureID(), 0);
Draw(tex);// 此处为绘制的纹理,
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
(4)这样多张纹理就绘制到defualtTex中了,可以保存出来,也可以直接作为纹理渲染显示
unsigned char* output_image = new unsigned char[M_WIDTH * M_HEIGHT * 3];
glBindTexture(GL_TEXTURE_2D,defualtTex);
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGB, GL_UNSIGNED_BYTE, output_image);
此时output_image保存了defualtTex中的数据,可以保存出看
代码稍后上传~
相关文章推荐
- php 魔术方法 __call
- iOS开发之Objective-c的MD5/SHA1加密算法的实现
- MD5加密
- 浅谈WEB安全性(前端向)
- QPS计算方法
- Xcode文件被锁定:The file ".xcodeproj" could not be unlocked
- copy-list-with-random-pointer
- Atlassian-CSDN软件商城
- word-wrap和word-break的区别
- Android得到控件在屏幕中的坐标
- 中间件迁移考虑的问题
- 第八届河南省程序设计大赛-NYOJ-1242-Interference Signal(水题)
- 打印业务设计模式--先写批次编号
- poj 1159 Palindrome(dp+滚动数组)
- 三个数gcd与lcm
- UrlBasedViewResolver与InternalResourceViewResolver
- JBoss 系列九十九:Rest WebService jBPM 6 集成演示样例
- IOS 上架要求视频
- 单钥密码体制和双钥密码体制有什么区别?
- Swagger与SpringMVC项目整合