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. 修改phpmyadmin不能导入大文件的限制

    情景:我需要导入一张1.03GB的数据表,但是phpmyadmin导入文件默认为不能超过2M.因此需要修改phpmyadmin导入文件的大小限制. 1.phpmyadmin的导入也就是php完成文件上 ...

  2. docker镜像使用和总结

    一.Docker镜像是什么? 操作系统分为内核和用户空间.在Linux中,内核启动后会挂载 root 文件系统为其提供用户空间支持. docker镜像就相当于一个 root文件系统.比如:官方镜像ub ...

  3. ECMAScript5提供了9个新数组方法:遍历、映射、过滤、检测、简化、和搜索数组

    大多数方法的第一个参数接收一个函数,并且对数组的每个元素调用一次该函数.如果是稀疏数组,对不存在的元素不调用传递的函数.在大多数情况下,调用提供的函数使用三个参数:数组元素,元素的索引,数组本身,通常 ...

  4. javascript截取字符串长度

    <html> <head> <meta charset="UTF-8"/> <title>截取字串长度</title> ...

  5. 主动驱动事件执行--createEvent

    1. createEvent(eventType)参数:eventType 共5种类型:    Events :包括所有的事件.           HTMLEvents:包括 'abort', 'b ...

  6. <head>标签和它的小伙伴们

    head标签是HTML文档中最基本的必须元素之一(body:对,还有我): <html> <head> <title>文档的标题</title> < ...

  7. QQ 聊天机器人小薇发布!

    简介 XiaoV(小薇)是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动: 监听多个 QQ 群消息,发现有"感兴趣"的内容时通过图灵机器人进行智能回复 监 ...

  8. 字符数字转换 atoi 与 strtol

    原文:http://www.cnblogs.com/JefferyZhou/archive/2010/07/01/1769555.html 在很多时候我们都很清楚 atoX 系列函数: atoi , ...

  9. 如何编译 opencv3 和 opencv_contrib(Linux)

    本文以编译并安装OpenCV 3.3.0 为例,安装系统为 Linux x64 (Fedora 21),具体步骤如下: 1. 下载 Source code zip 压缩包 从下面网址,选择 openc ...

  10. web项目开发流程

    对于一个web项目,在实际编码之前,有一些通用的步骤来planning a website: 0.Defining the project (predr0->dr0) 对于外部项目,客户一般会发 ...