windows下3D文字
windows下3D文字
简单概述
需要在每一帧的视频图像上面添加3D文字,文字可以自由移动位置,变换各种字体属性,还能进行一些简单动画。然后把处理好的视频图像传个下一个步骤去处理。做的过程中参考了GitHub上的一个开源项目[1],这个项目有一点内存泄露,需要修改一下。我们的项目主要思路利用opengl+freetype实现,首先使用freetype生成文字的3d顶点,然后使用曲面细分[2],生成更细致的顶点数据,接着计算顶点的法线,便于后面光照计算。渲染过程,首先把视频图像纹理绘制,然后开启混合,画上3d文字,这些都离屏渲染到一个Framebuffer,使用glBlitFramebuffer转移到 draw Framebuffer上,最后使用glReadPixels读取渲染后的图像数据。
一、文字与图像的融合
开始是先绘制的图像纹理,然后切换shader program,开启混合:
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
结果在vs和mingw环境下都是只有视频图像,没有文字,接着我改了一下先绘制文字后面绘制视频图像,开启这种混合:glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_DST_ALPHA);,在vs和mingw都可以显示正常了。目前还没搞清楚为什么前一种情况,文字没有融合进去。
二、离屏渲染
项目中很多过程都是在cpu里面实现的,所以我们需要把3d文字进行离屏渲染,然后从GPU里面读到内存,这会消耗一定的性能。因为文字的字体大小可变,当放大时候,如果不进行抗锯齿处理,文字会很难看。生成read framebuffer和draw framebuffer,绘制后读取图像数据。
//生成两个fbo
enum {color , depth, buffer_count};
GLuint back_buffers[buffer_count];
int msaa_level = 4;
glGenFramebuffers(1, &m_backfbo);
glBindFramebuffer(GL_FRAMEBUFFER, m_backfbo);
glGenRenderbuffers(buffer_count, back_buffers);
glBindRenderbuffer(GL_RENDERBUFFER, back_buffers[color]);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, m_canvasWidth, m_canvasHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,back_buffers[color]);
glBindRenderbuffer(GL_RENDERBUFFER, back_buffers[depth]);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, m_canvasWidth,m_canvasHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, back_buffers[depth]);
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE)
std::cout << "frame buffer status fail\n";
GLuint render_buffers[buffer_count];
glGenFramebuffers(1, &m_renderfbo);
glBindFramebuffer(GL_FRAMEBUFFER, m_renderfbo);
glGenRenderbuffers(buffer_count, render_buffers);
glBindRenderbuffer(GL_RENDERBUFFER, render_buffers[color]);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, msaa_level, GL_RGBA8, m_canvasWidth, m_canvasHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, render_buffers[color]);
glBindRenderbuffer(GL_RENDERBUFFER, render_buffers[depth]);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, msaa_level,
GL_DEPTH_COMPONENT24, m_canvasWidth, m_canvasHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, render_buffers[depth]);
status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE)
std::cout << "frame buffer status fail\n";
//....after draw
glBindFramebuffer(GL_READ_FRAMEBUFFER, m_renderfbo);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_backfbo);
glBlitFramebuffer(0, 0, m_canvasWidth, m_canvasHeight, 0, 0, m_canvasWidth, m_canvasHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST);
glBindFramebuffer(GL_FRAMEBUFFER, m_backfbo);
glReadPixels(0, 0, m_canvasWidth, m_canvasHeight, GL_RGBA, GL_UNSIGNED_BYTE, offscreen_image); //get offscreen image
最后效果如下:

windows下3D文字的更多相关文章
- MYGUI3.2改造——完善windows下的文字显示
MYGUI 3.2 是支持中文显示的——往“MyGUI_Fonts.xml”文件里添加上中文的编码范围即可,这个网上有很多. 能显示中文后,再添加中文的自动换行,这个网上有:http://blog.s ...
- 如何将Windows电脑桌面上软件图标下的文字去掉
如何将Windows电脑桌面上软件图标下的文字去掉 重命名的时候,点击鼠标右键.选择“插入Unicode控制字符” 效果
- C#+OpenGL+FreeType显示3D文字(1) - 从TTF文件导出字形贴图
C#+OpenGL+FreeType显示3D文字(1) - 从TTF文件导出字形贴图 +BIT祝威+悄悄在此留下版了个权的信息说: 最近需要用OpenGL绘制文字,这是个很费时费力的事.一般的思路就是 ...
- 让 windows 下的命令行程序 cmd.exe 用起来更顺手
在 Windows 下使用 Larave 框架做开发,从 Composer 到 artisan 总是避免不了和 cmd.exe 打交道,系统默认的命令行界面却是不怎么好看,且每行显示的字符数是做了限制 ...
- 原创 C++应用程序在Windows下的编译、链接:第一部分 概述
本文是对C++应用程序在Windows下的编译.链接的深入理解和分析,文章的目录如下: 我们先看第一章概述部分. 1概述 1.1编译工具简介 cl.exe是windows平台下的编译器,link.ex ...
- Windows下LATEX排版论文攻略—CTeX、JabRef使用介绍
Windows下LATEX排版论文攻略—CTeX.JabRef使用介绍 一.工具介绍 TeX是一个很好排版工具,在学术界十分流行,特别是数学.物理学和计算机科学界. CTeX是TeX中的一个版本,指的 ...
- Android学习——windows下搭建Cygwin环境
在上一篇博文<Android学习——windows下搭建NDK_r9环境>中,我们详细的讲解了在windows下进行Android NDK开发环境的配置,我们也讲到了在NDk r7以后,我 ...
- Android学习——windows下搭建NDK_r9环境
1. NDK(Native Development Kit) 1.1 NDK简介 Android NDK是一套允许开发人员使用本地代码(如C/C++)进行Android APP功能开发的工具,通过这个 ...
- React-Native android在windows下的踩坑记
坑很多,跳之前做好准备.没有VPN的同学请浏览完本文后慎行. 你需要先安装最新版本的node.js(我最后使用的是v4.1.2),前往官网下载>> 注:我win7已经安装过Visual ...
随机推荐
- 修改phpmyadmin不能导入大文件的限制
情景:我需要导入一张1.03GB的数据表,但是phpmyadmin导入文件默认为不能超过2M.因此需要修改phpmyadmin导入文件的大小限制. 1.phpmyadmin的导入也就是php完成文件上 ...
- docker镜像使用和总结
一.Docker镜像是什么? 操作系统分为内核和用户空间.在Linux中,内核启动后会挂载 root 文件系统为其提供用户空间支持. docker镜像就相当于一个 root文件系统.比如:官方镜像ub ...
- ECMAScript5提供了9个新数组方法:遍历、映射、过滤、检测、简化、和搜索数组
大多数方法的第一个参数接收一个函数,并且对数组的每个元素调用一次该函数.如果是稀疏数组,对不存在的元素不调用传递的函数.在大多数情况下,调用提供的函数使用三个参数:数组元素,元素的索引,数组本身,通常 ...
- javascript截取字符串长度
<html> <head> <meta charset="UTF-8"/> <title>截取字串长度</title> ...
- 主动驱动事件执行--createEvent
1. createEvent(eventType)参数:eventType 共5种类型: Events :包括所有的事件. HTMLEvents:包括 'abort', 'b ...
- <head>标签和它的小伙伴们
head标签是HTML文档中最基本的必须元素之一(body:对,还有我): <html> <head> <title>文档的标题</title> < ...
- QQ 聊天机器人小薇发布!
简介 XiaoV(小薇)是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动: 监听多个 QQ 群消息,发现有"感兴趣"的内容时通过图灵机器人进行智能回复 监 ...
- 字符数字转换 atoi 与 strtol
原文:http://www.cnblogs.com/JefferyZhou/archive/2010/07/01/1769555.html 在很多时候我们都很清楚 atoX 系列函数: atoi , ...
- 如何编译 opencv3 和 opencv_contrib(Linux)
本文以编译并安装OpenCV 3.3.0 为例,安装系统为 Linux x64 (Fedora 21),具体步骤如下: 1. 下载 Source code zip 压缩包 从下面网址,选择 openc ...
- web项目开发流程
对于一个web项目,在实际编码之前,有一些通用的步骤来planning a website: 0.Defining the project (predr0->dr0) 对于外部项目,客户一般会发 ...