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

最后效果如下:


  1. https://github.com/Xiangwk/Text3D_with_OpenGL ↩︎

  2. http://www.songho.ca/opengl/gl_tessellation.html ↩︎

windows下3D文字的更多相关文章

  1. MYGUI3.2改造——完善windows下的文字显示

    MYGUI 3.2 是支持中文显示的——往“MyGUI_Fonts.xml”文件里添加上中文的编码范围即可,这个网上有很多. 能显示中文后,再添加中文的自动换行,这个网上有:http://blog.s ...

  2. 如何将Windows电脑桌面上软件图标下的文字去掉

    如何将Windows电脑桌面上软件图标下的文字去掉 重命名的时候,点击鼠标右键.选择“插入Unicode控制字符” 效果

  3. C#+OpenGL+FreeType显示3D文字(1) - 从TTF文件导出字形贴图

    C#+OpenGL+FreeType显示3D文字(1) - 从TTF文件导出字形贴图 +BIT祝威+悄悄在此留下版了个权的信息说: 最近需要用OpenGL绘制文字,这是个很费时费力的事.一般的思路就是 ...

  4. 让 windows 下的命令行程序 cmd.exe 用起来更顺手

    在 Windows 下使用 Larave 框架做开发,从 Composer 到 artisan 总是避免不了和 cmd.exe 打交道,系统默认的命令行界面却是不怎么好看,且每行显示的字符数是做了限制 ...

  5. 原创 C++应用程序在Windows下的编译、链接:第一部分 概述

    本文是对C++应用程序在Windows下的编译.链接的深入理解和分析,文章的目录如下: 我们先看第一章概述部分. 1概述 1.1编译工具简介 cl.exe是windows平台下的编译器,link.ex ...

  6. Windows下LATEX排版论文攻略—CTeX、JabRef使用介绍

    Windows下LATEX排版论文攻略—CTeX.JabRef使用介绍 一.工具介绍 TeX是一个很好排版工具,在学术界十分流行,特别是数学.物理学和计算机科学界. CTeX是TeX中的一个版本,指的 ...

  7. Android学习——windows下搭建Cygwin环境

    在上一篇博文<Android学习——windows下搭建NDK_r9环境>中,我们详细的讲解了在windows下进行Android NDK开发环境的配置,我们也讲到了在NDk r7以后,我 ...

  8. Android学习——windows下搭建NDK_r9环境

    1. NDK(Native Development Kit) 1.1 NDK简介 Android NDK是一套允许开发人员使用本地代码(如C/C++)进行Android APP功能开发的工具,通过这个 ...

  9. React-Native android在windows下的踩坑记

    坑很多,跳之前做好准备.没有VPN的同学请浏览完本文后慎行.   你需要先安装最新版本的node.js(我最后使用的是v4.1.2),前往官网下载>> 注:我win7已经安装过Visual ...

随机推荐

  1. 判断sql是否存在特定的对象

    1 判断数据库是否存在if exists (select * from sys.databases where name = '数据库名') drop database [数据库名] 2 判断表是否存 ...

  2. python 中 \n 和转义r的作用和\r的实际应用

    我们先看看这张转义字符图: 1. 知识储备 \r 表示将光标的位置回退到本行的开头位置 \b 表示将光标的位置回退一位 在 python 语言中, 使用 print 打印输出时,默认是会进行换行的.如 ...

  3. inline-block元素,在同一行上下显示

    两个元素使用了inline-block,并列显示时,会上下显示,给人感觉不在同一行 原因:其中一个元素使用了overflow:hidden,导致了基线变更 解决:1.另一个元素也添加overflow: ...

  4. Java入门到精通——调错篇之Astah Community打开报需要jre1.7运行环境

    1.问题概述     Astah Community安装完以后点击运行Astah Community的时候报此应用需要jdk1.7如下图     但是我的电脑在D盘装了jdk1.8了为什么这个软件为什 ...

  5. world特殊控制符输入

    特殊符号的输入表示法. 1,“^l”表示软回车(象这种“↓”). 2,“^p”表示硬回车. 3,“^t”表示制表符. 4,“^m”表示手动分页符. 5,“^+”表示长划线(—). 6,“^=”表示短划 ...

  6. C++程序员必需的修养

    原文:http://www.cnblogs.com/ctoroad/archive/2006/03/24/357423.html 我总结了在用C/C++语言(主要是C语言)进行程序写作上的三十二个“修 ...

  7. 用Eclipse创建第一个Spring项目(最最入门级)

    http://blog.csdn.net/shymi1991/article/details/48085955 网上关于Spring的介绍资料已经数不胜数,但大多篇幅冗长,初学者不易理解记忆.这里先作 ...

  8. named 快速部署及主机记录普及

    实验环境centos7.2,仅供参考 yum -y install epel-release    --安装最新yum配置源 cd /etc/yum.repos.d/ # wget http://re ...

  9. angular中的scope

    angular.element($0).scope() 什么是scope? scope是一个refer to the application model的object.它是一个expression的执 ...

  10. python接口自动化4-绕过验证码登录(cookie) (转载)

    前言 有些登录的接口会有验证码:短信验证码,图形验证码等,这种登录的话验证码参数可以从后台获取的(或者查数据库最直接). 获取不到也没关系,可以通过添加cookie的方式绕过验证码. 一.抓登录coo ...