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 ...
随机推荐
- centos7编译安装git最新版
假如系统已经安装了git,先删除. 如果是通过yum安装的,直接在终端使用以下指令删除: yum remove git 如果是通过源码编译安装的,参考以下文章: Linux ./configure & ...
- mysql load data infile auto increment id
1. 问题描述 当使用load data infile 向表中插入数据 而主键id是 auto_increment 时 ,执行 load data 不会报错 但插入也不成功 2. 问题解决 2.1 方 ...
- Android 查看和管理sqlite数据库
在Android中可以使用Eclipse插件DDMS来查看,也可以使用Android工具包中的adb工具来查看.android项目中的sqlite数据库位于/data/data/项目包/databas ...
- 【Android】Warning :uninstalling will remove the application data!
最近从Android Studio向手机发布项目过程中经常出现, 问题虽小,但是开发过程中确实浪费时间. It is possible that issue is resolved by uninst ...
- Android通过浏览器打开app页面并且传递值
最近公司有个需求,要求从第三方网页端打开一个网页,然后在网页中点击“下载”,“打开”按钮,在app端进行下载和打开操作.这里记录下方法. 首先,网页和app页面进行交互,其实会很快想到JS交互,但是现 ...
- Springmvc ajax跨域请求处理
上次给一个网站写网站 前后端分离 最后跪在ajax跨域上面了 自己在网上找了个方法 亲试可用 记录一下 写一个类 继承HandlerInterceptorAdapter package co ...
- Linq中使用Left Join 和 Right Join
原文地址:http://www.cnblogs.com/xinjian/archive/2010/11/17/1879959.html 准备一些测试数据,如下: use Test Create tab ...
- Linux下配置免密登录!
ssh-keygen 产生公钥与私钥对. ssh-copy-id 将本机的公钥复制到远程机器的authorized_keys文件中,ssh-copy-id也能让你有到远程机器的home, ~./ss ...
- Linux->ZooKeeper集群搭建
人,总免不了有心结,限制着自己,难以前行.对于ZooKeeper的理解,以及实践也拖了很久,今天用零散时间学习一下,补点干货. 一.简述 Zookeeper是Google的Chubby一个开源的实现, ...
- 【深入理解JAVA虚拟机】第二部分.内存自动管理机制.1.内存区域
1.内存区域 根据<Java虚拟机规范(Java SE 7版)> 的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域,如图所示. 程序计数器 当前线程所执行的字节码的行号指 ...