一种高效OpenGL多线程文本绘制方法

合集下载

实验三 OpenGL的简单交互绘制new

实验三 OpenGL的简单交互绘制new

实验三 OpenGL的简单交互绘制一、实验目的1、理解OpenGL坐标系的概念,掌握OpengGL裁剪窗口、视区、显示窗口的概念和它们之间的关系,学会计算世界坐标和屏幕坐标。

2、学会OpenGL的简单键盘交互操作。

3、学会OpenGL的简单字符绘制。

3、进一步掌握OpengGL点、直线、多边形的绘制。

二、实验环境硬件要求:PC机,主流配置,最好为独立显卡,显存512M以上。

软件环境:操作系统:Windows XP。

语言开发工具:Microsoft Visual studio 2008,Visual C++。

程序框架:Win32应用程序三、实验内容与要求3.1 键盘交互1、调出实验一的源代码运行,调整修改使得显示窗口在屏幕中央保持缺省大小(300*300),绘制的矩形在显示窗口中央。

如图2-1所示。

提示:(1)添加修改窗口位置的函数glutInitWindowPosition(int x, int y);其中(x,y)为窗口左上角在屏幕上的位置。

(2)显示窗口的左下角坐标为(-1,-1),右上角坐标为(1,1)。

图2-1未修改前的win32初始源程序参考如下:/*my first program.cpp*/#include"stdafx.h"#include<glut.h>void display(void);void myreshape(GLsizei w, GLsizei h);int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow){UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine);char *argv[] = {"hello ", " "};int argc = 2; // must/should match the number of strings in argvglutInit(&argc, argv); //初始化GLUT库;glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //设置显示模式;(缓冲,颜色类型)glutInitWindowSize(500, 500);glutInitWindowPosition(1024 / 2 - 250, 768 / 2 - 250);glutCreateWindow("Hello"); //创建窗口,标题为“hello”;glutDisplayFunc(display); //用于绘制当前窗口;glutMainLoop(); //表示开始运行程序,用于程序的结尾;return 0;}void display(void){glClear(GL_COLOR_BUFFER_BIT); //刷新颜色缓冲区glRectf(-0.5,-0.5,0.5,0.5);glFlush(); //用于刷新命令队列和缓冲区,使所有尚未被执行的OpenGL命令得到执行}2、在实验一的基础上添加键盘交互,按W键绘制的矩形上移,按S键矩形下移,按A键矩形左移,按D键矩形右移,如图2-2。

初学OpenGL:什么是绘制上下文

初学OpenGL:什么是绘制上下文

初学OpenGL:什么是绘制上下文什么是绘制上下文(Rendering Context)初学OpenGL,打开红宝书,会告诉你OpenGL是个状态机,OpenGL采用了客户端-服务器模式,那时觉得好抽象,直到后来了解了绘制上下文才把这些联系起来。

我们可以认为每一个硬件GPU是个服务器,每一个绘制上下文对应于申请的一个客户端,一个客户端维护着一套状态机,如果两个窗口分别对应两个不同的绘制上下文,则两个窗口彼此状态独立。

申请绘制上下文,意味着系统资源的申请,每个绘制上下文还是需要不少资源的,记得曾经试过在chrome的TAB页不断加载WebGL页面,由于WebGL使用的是OpenGL ES,同样需要绘制上下文,当加载三十多个页面的时候,Chrome整个崩溃了。

所有的OpenGL调用,都需要指定是在哪个上下文环境下调用的。

不同的上下文中,同样的资源ID,可能对应于各自上下文中不同类型的资源。

不同的操作系统,都有各自的绘制上下文创建、和设置当前绘制上下文的API。

如何创建绘制上下文我们一般做Demo程序,都会使用GLUT,所以很多人可能并没有自己创建过绘制上下文。

GLUT的函数GlutCreateWindow除了创建了一个窗口,同时还创建了一个绘制上下文,并将创建的绘制上下文设置为当前的绘制上下文。

对于Windows平台,首先创建一个设备上下文(Device Context,DC),以DC为输入,可以创建一个绘制上下文。

创建绘制上下文以后,调用MakeCurrent,将创建的上下文设置为当前的绘制上下文。

创建了绘制上下文,并设置为当前上下文以后,还不能使用OpenGL最新的特性,调用OpenGL 1.1以后的API仍然会崩溃。

一般我们使用Glew库,调用glewInit(),得到OpenGL 随显卡驱动一起发布的新特性的函数入口地址。

绘制上下文和线程两个线程同时MakeCurrent到同一个绘制上下文,会导致程序崩溃。

OpenGL进行文字显示的方法

OpenGL进行文字显示的方法

O p e n G L进行文字显示的方法Company Document number:WTUT-WT88Y-W8BBGB-BWYTT-19998任何一个DEMO、仿真项目、游戏,都少不了文字这种媒体。

这不可不说是对图形视觉媒体的补充——我们还有一些无法超越文字来向观众表达的心事,或是补充说明,或是感悟,或是感激。

——一般的文字不属于图形渲染部分,而属于用户界面部分,这在游戏引擎中看或许一目了然,但是在底层的图形渲染API——OPENGL或D3D中,文字的显示“并不是必须”,但它是多么深深地被需要着口牙。

所以,把字体设置、文字显示作为一种图形学技术而非单纯的完全我属或他属,我是这么想的。

(同样,拾取也算是这样吧[])本文来源于ZwqXin(),转载请注明原文地址:怎么表达文字呢在OpenGL中,我们没有什么现成的东西可用,但确实有办法让我们“得到这种技术”。

让我最记忆深刻的是NEHE的两三篇教程(貌似都是十几课吧),讲述的就是今天的这个主题。

可以到或者在DANCINGWIND的中文翻译(见[])看看~。

而我所知道的这三种方法,前两种应该就是来自那里吧(记得~~),当时要努力完成课程DEMO,于是胡胡混混地就把相应的那两三课学了,而且把它的文字显示方法应用到自己的程序中(还经历了一段艰辛的探索史...连我当时的MyFont类也记录了这份小辛酸,现在看来,是因为当时的知识水平不够理解吧)。

然后后来又一个课程DEMO,老师后来觉得我应该“写中文”,于是我又去探索中文字体显示方法了,并在一个开源DEMO中找到,分析代码段后就拿来主义了,至昨不曾好好考究——这就是我所知的第三种方法。

三种方法都是三步曲:在初始化的时候“创建字体”[Build],在渲染阶段“应用字体”(显示文字)[Print],在程序结束或不再需要文字显示的时候“销毁字体”[kill]。

其中前两步比较重要,着重讨论讨论哈~1.常规的屏幕字体打印(NormalFont)应用得比较广,大名鼎鼎的AZURE以前的DEMO就是用这个的。

qt5opengl编译

qt5opengl编译

qt5opengl编译Qt5是一种跨平台的应用程序开发框架,而OpenGL是一种用于渲染2D和3D图形的图形库。

将这两者结合起来,可以实现更加强大和高效的图形渲染效果。

本文将介绍如何使用Qt5开发OpenGL应用程序,并讨论一些与Qt5和OpenGL相关的主题。

我们需要了解Qt5中的OpenGL模块。

Qt提供了一个名为QtOpenGL 的模块,它包含了与OpenGL相关的类和函数。

使用QtOpenGL,我们可以轻松地创建一个OpenGL窗口,并在其中绘制2D或3D图形。

在开始使用Qt5开发OpenGL应用程序之前,我们需要安装Qt开发环境。

可以从Qt官方网站上下载并安装Qt Creator,它是一个集成开发环境,可以方便地创建和管理Qt项目。

一旦安装好Qt Creator,我们就可以开始创建一个新的Qt项目。

选择“新建项目”选项,然后选择“Qt Widgets Application”模板。

接下来,我们可以选择项目的名称和位置,并点击“下一步”。

在下一个对话框中,我们可以选择所需的模块。

在这里,我们需要选择“Qt OpenGL”模块,并点击“下一步”。

最后,我们可以选择项目的构建目标和构建工具链,并点击“完成”按钮。

创建好项目后,我们可以打开主窗口的源文件(通常是mainwindow.cpp),并添加一些与OpenGL相关的代码。

首先,我们需要在主窗口类的构造函数中创建一个QOpenGLWidget对象,它是一个用于显示OpenGL图形的窗口部件。

我们可以使用setCentralWidget函数将该窗口部件设置为主窗口的中央部件。

接下来,我们需要重写QOpenGLWidget的initializeGL、paintGL 和resizeGL函数。

initializeGL函数在OpenGL上下文初始化时被调用,我们可以在这里进行一些初始化操作,如设置OpenGL的状态。

paintGL函数在窗口需要重新绘制时被调用,我们可以在这里进行绘制操作。

OpenGL11-绘制汉字最高效方法(使用Freetype)(代码已更新)

OpenGL11-绘制汉字最高效方法(使用Freetype)(代码已更新)

OpenGL11-绘制汉字最⾼效⽅法(使⽤Freetype)(代码已更新)OpenGL本⾝并没有绘制⽂字的功能,他只是⼀个三维绘图的API集和,很多东西都要⾃⼰动⼿才可以实现。

OpenGL绘制⽂字,⽹络上已经有很多成熟的⽅式⽅法,我这⾥给⼤家介绍的是我使⽤的⽅式,从绘制的效率上来说,速度上从已经达到我个⼈⽔平的最⼤值。

如果你有更好的⽅式,请联系我。

⾸先介绍下⽹络上的⼀些绘制⽅式。

⼀、将要绘制的⽂字按照每⼀个字⽣成⼀个⼩纹理的⽅式,然后再⽤将纹理贴到⽹格的表⾯,绘制出来,例如:“博客园-你好”,则会⽣成6个⼩纹理,然后⽣成⽹格,将纹理贴到⽹格的表⾯。

优点:每⼀个字的⼤⼩颜⾊都可选择。

缺点:⽂字多了以后,频繁的切换纹理造成效率低下。

OSG中使⽤了这种⽅式,效率极差,尤其是在⽂字更新的情况下。

⼆、直接将随绘制的⽂本字符串⽣成⼀个纹理数据(⽽不是⼀个⽂字⼀个纹理),这样做效率上⽐第⼀种要好很多,缺点就是更新的时候要重新构建⼀个新的纹理。

速度上有很⼤损失。

两种⽅式的原理图如下: 三、将所绘制的⽂字都放到⼀个较⼤的纹理上去,然后再纹理上做索引,当绘制的时候,去查表。

在将纹理贴到⽹格上绘制出来,这种⽅式,速度很快,很多游戏引擎都在使⽤这种⽅式,存在的问题绘制的⽂字多了以后速度会变慢,占⽤⼤量的cpu时间,当然对于⼩的应⽤已经⾜够了,今天我提出的⽅式也是基于这样⽅式的,只是我在索引上最了⼀些改进,改进之后的算法,将不再进⾏查表操作,⽽是直接索引,⼀定程度上降低了cpu消耗,提搞了效率。

纹理图⽚如下⽰意图:图⽚存的数据上也很重要,结合OpenGL,采⽤GL_ALPHA的上存储,这样可以⼤⼤降低图⽚所占⽤的显存空间,从⽽提⾼效率。

下⾯定义⼀个⽂字所存储的信息,如下所⽰:class Character{public:Character(){x0 = 0;y0 = 0;x1 = 0;y1 = 0;}/*** 存储当前字符在纹理上的坐标位置*/unsigned short x0;unsigned short y0;unsigned short x1;unsigned short y1;};为了快速索引,减少查找的过程,我么要结合字体本上来做⼀些处理,我们知道⼀个汉字要占⽤2个字节两个字节所能表⽰的范围是0-65535,就是6万多个汉字,那么我们就声明⼀个这么⼤的数组来存储字符的信息:代码如下:Character g_charMap[1<<16];当我们要绘制⼀个⽂字的时候,可以直接通过下标就可以直接定位到该字对应的信息了,例如我们绘制'中'就可以直接获取其在图⽚上的内容了:Character getCharacter(wchar_t ch){return g_charMap[ch];}然后这样也存在⼀个问题,即⼀张多⼤的纹理才可以容纳这么多的字符呢?如果是⼀般的应⽤,我们可以忽略这个问题,中国常⽤的汉字只有3000多个,假设是⼀个汉字占16*16的空间,那么⼀个1024*1024的纹理所能容纳的字符有 1024/16 * 1024/16 = 4096个,⾜够满⾜正常的需要,如果你是想做⼀个通⽤的,没有瑕疵的应⽤,我们就要修改我们的设计⽅式,我能⼀切从速度优先的⽅式考虑,我们在上⾯的Character类中增加⼀个字段描述字符所在的纹理句柄,如下:class Character{public:Character(){x0 = 0;y0 = 0;x1 = 0;y1 = 0;texId = 0;}unsigned short x0;unsigned short y0;unsigned short x1;unsigned short y1;//! 索引纹理,即当前字符所在的纹理unsigned texId;};这样,就可以拜托之前的限制,实现⼤规模的绘制⽂字了。

opengl教程

opengl教程

opengl教程
OpenGL是一种用于图形处理的开放式图形库。

它提供了一套
函数接口,可以在不同的平台上进行图形编程,并且可以利用图形硬件加速来实现高性能的图形渲染。

OpenGL教程是一种指导用户学习和使用OpenGL的资料。


些教程通常会包含一些基础知识,例如如何初始化OpenGL上下文,以及如何创建和绘制基本的几何图形。

此外,教程还会介绍一些高级技术,例如纹理映射、光照和阴影等。

初学者可以通过阅读和完成这些教程来快速上手OpenGL编程。

教程通常会提供一些示例代码,让学习者可以直接运行和尝试,并且每个步骤都会有详细的说明和解释。

通过实际操作,学习者可以更好地理解OpenGL的概念和原理。

一般来说,OpenGL教程可以按照难度和内容的不同分为多个
部分。

初级教程主要介绍OpenGL的基本概念和操作,例如如何绘制简单的几何图形和设置基本的材质和光照。

中级教程则会介绍一些常用的高级技术,例如纹理映射、着色器编程和渲染优化等。

高级教程则会涉及一些更复杂和专业的主题,例如体积渲染、GPU计算和图形学算法等。

OpenGL教程是学习和掌握OpenGL编程的重要资源。

通过学
习这些教程,不仅可以获得对OpenGL的全面理解,还可以提高图形编程的能力和技巧。

无论是想要从事图形相关的工作,还是对图形编程感兴趣的爱好者,都可以通过学习OpenGL教程来提升自己的技术水平。

opengl使用手册 简书

opengl使用手册 简书

opengl使用手册简书【实用版】目录一、OpenGL 简介二、OpenGL 函数库1.核心函数库2.矩阵操作、几何变换和投影变换函数3.扩展库 GLEW三、OpenGL 菜单的使用1.交互式输入设备的处理2.glut 命令与鼠标函数四、总结正文一、OpenGL 简介OpenGL(Open Graphics Library)是一个跨平台的图形编程接口,用于渲染 2D 和 3D 图形。

它被广泛应用于游戏开发、计算机辅助设计、虚拟现实等领域。

OpenGL 提供了丰富的函数库,可以实现各种复杂的图形效果。

二、OpenGL 函数库OpenGL 的函数库主要可以分为核心函数库和扩展库。

核心函数库包含了基本的绘图功能,如绘制几何图元、矩阵操作、几何变换和投影变换等。

扩展库 GLEW(GLEW Extension Wrangler Library)则提供了更多的高级功能,如阴影、纹理贴图等。

1.核心函数库核心函数库包含了许多常用的绘图函数,如:- glBegin():开始绘制- glEnd():结束绘制- glVertex():绘制一个顶点- glColor():设置颜色2.矩阵操作、几何变换和投影变换函数OpenGL 提供了丰富的矩阵操作、几何变换和投影变换函数,如:- glPushMatrix():矩阵入栈- glPopMatrix():矩阵出栈- glTranslate():几何变换(平移)- glRotate():几何变换(旋转)- glScale():几何变换(缩放)- gluPerspective():投影变换3.扩展库 GLEWGLEW 是一个方便的扩展库,可以方便地管理 OpenGL 扩展。

它提供了一系列的函数,如:- glewInit():初始化 GLEW- glewGetError():获取 GLEW 错误- glewCreateContext():创建 OpenGL 上下文- glewMakeCurrent():设置当前 OpenGL 上下文三、OpenGL 菜单的使用OpenGL 支持交互式输入设备,如鼠标和键盘。

opengl教程

opengl教程

opengl教程OpenGL是一种图形编程接口,常用于计算机图形学和游戏开发。

本文将介绍OpenGL的基本概念、功能和使用方法。

首先,OpenGL是一种跨平台的图形编程接口,可以在不同操作系统和硬件上运行。

它是一个开放标准,由Khronos Group维护和发展,因此可以在各种平台上使用,如Windows、MacOS、Linux等。

OpenGL的核心是图形渲染管线。

图形渲染管线是指一系列的图形处理阶段,用于将3D图形数据转化为2D图像。

这些阶段包括几何处理、光栅化、片元处理等。

每个阶段都包含了一些特定的操作和功能,通过这些操作和功能,我们可以实现各种不同的图形效果和渲染技术。

在使用OpenGL之前,需要初始化OpenGL的上下文,并创建一个OpenGL窗口。

通过OpenGL的API(Application Programming Interface),我们可以控制各个渲染阶段的操作和参数。

例如,我们可以设置物体的位置、颜色、纹理等属性,还可以控制光照、深度测试等渲染参数。

OpenGL还提供了一些基本的几何图形绘制函数,如绘制点、线段、三角形等。

通过这些函数,我们可以绘制各种基本的几何图形。

此外,OpenGL还支持纹理映射、着色器编程等高级渲染技术,可以实现更加复杂的视觉效果。

在OpenGL中,最常用的是顶点数组和顶点缓冲对象。

顶点数组用于存储顶点的位置、颜色、纹理坐标等属性,而顶点缓冲对象用于管理顶点数组的内存。

通过顶点数组和顶点缓冲对象,我们可以高效地传输大量的顶点数据到显存,并在图形渲染管线中使用。

除了基本的图形绘制,OpenGL还支持一些高级的渲染技术,如光照、阴影、深度测试等。

这些技术可以让我们实现更加逼真和真实感的图形效果。

例如,通过光照技术,我们可以模拟不同光源的光照效果,使物体看起来更加立体和有质感。

而深度测试可以确保正确的渲染顺序,使得物体之间的遮挡关系得到正确的呈现。

总结一下,OpenGL是一种功能丰富且强大的图形编程接口。

【OpenGL】使用FreeType库加载字体并在GL中绘制文字

【OpenGL】使用FreeType库加载字体并在GL中绘制文字

【OpenGL】使⽤FreeType库加载字体并在GL中绘制⽂字FreeType⽤起来⽐较⿇烦,这⾥写了⼀份简单的⽰例代码,仅供参考。

实现了FT库⽣成字符位图,并上传到GL纹理。

实现了字符位图缓存功能,多个字符图像保存在同⼀个纹理中。

实现了简单的字体管理框架。

实现了简单的加粗和倾斜效果。

实现了反锯齿开关,并且兼容加粗倾斜效果。

代码如下:1// OpenGL library2 #include <gl/glut.h>34// Std misc5 #include <map>6 #include <vector>78// FreeType library9 #include <ft2build.h>10 #include FT_FREETYPE_H11 #include FT_BITMAP_H12 #include FT_OUTLINE_H131415 #ifdef CreateFont16#undef CreateFont17#endif1819 typedef unsigned char byte;2021class CFontManager22 {23public:24 CFontManager();25 ~CFontManager();2627bool initialize(void);28void release(void);29int createFont(const char *filename, int face, int tall, bool bold, bool italic, bool antialias);30bool getCharInfo(int font_index, int code, int *wide, int *tall, int *horiBearingX, int *horiBearingY, int *horiAdvance, GLuint *texture, float coords[]);31int getFontTall(int font_index);3233private:34struct glyphMetrics35 {36int width;37int height;38int horiBearingX;39int horiBearingY;40int horiAdvance;41//int vertBearingX;42//int vertBearingY;43//int vertAdvance;44 };4546class CFont47 {48public:49 CFont();50 ~CFont();5152bool create(FT_Library library, const char *filename, FT_Long face_index, int tall, bool bold, bool italic, bool antialias);53void release(void);54bool getCharInfo(int code, glyphMetrics *metrics, GLuint *texture, float coords[]);55int getFontTall(void);5657private:58bool loadChar(int code, glyphMetrics *metrics);5960class CChar61 {62public:63void setInfo(glyphMetrics *metrics);64void getInfo(glyphMetrics *metrics, GLuint *texture, float coords[]);66public:67int m_code;68 GLuint m_texture;69float m_coords[4]; // left top right bottom7071private:72 glyphMetrics m_metrics;73 };7475class CPage76 {77public:78 CPage();79 ~CPage();8081bool append(int wide, int tall, byte *rgba, float coords[]);82 GLuint getTexture(void);8384private:85 GLuint m_texture;86int m_wide;87int m_tall;88int m_posx;89int m_posy;90int m_maxCharTall;91 };9293 typedef std::map<int, CChar *> TCharMap;9495 FT_Library m_library;96 FT_Face m_face;97bool m_antialias;98bool m_bold;99int m_tall;100int m_rgbaSize;101 GLubyte *m_rgba;102 TCharMap m_chars;103 std::vector<CPage *> m_pages;104 };105106 FT_Library m_library;107 std::vector<CFont *> m_fonts;108 };109110111112//------------------------------------------------------------113// CFont114//------------------------------------------------------------115 CFontManager::CFont::CFont()116 {117 m_face = NULL;118 m_rgba = NULL;119 m_antialias = false;120 m_bold = false;121 m_tall = 0;122 }123124 CFontManager::CFont::~CFont()125 {126 release();127 }128129bool CFontManager::CFont::create(FT_Library library, const char *filename, FT_Long face_index, int tall, bool bold, bool italic, bool antialias) 130 {131 FT_Error err;132133if (tall > 256)134 {135// Bigger than a page size136return false;137 }138139if ((err = FT_New_Face(library, filename, face_index, &m_face)) != FT_Err_Ok)140 {141 printf("FT_New_Face() Error %d\n", err);142return false;143 }144145if ((err = FT_Set_Pixel_Sizes(m_face, 0, tall)) != FT_Err_Ok)146 {147 printf("FT_Set_Pixel_Sizes() Error %d\n", err);148return false;150151 m_rgbaSize = (tall * 2) * tall * 4;152153 m_rgba = new GLubyte[m_rgbaSize];154155if (m_rgba == NULL)156 {157return false;158 }159160 m_library = library;161 m_antialias = antialias;162 m_bold = bold;163 m_tall = tall;164165if (italic)166 {167 FT_Matrix m;168 m.xx = 0x10000L;169 m.xy = 0.5f * 0x10000L;170 m.yx = 0;171 m.yy = 0x10000L;172 FT_Set_Transform(m_face, &m, NULL);173 }174175return true;176 }177178void CFontManager::CFont::release(void)179 {180 FT_Error err;181182if (m_face)183 {184if ((err = FT_Done_Face(m_face)) != FT_Err_Ok)185 {186 printf("FT_Done_Face() Error %d\n", err);187 }188 m_face = NULL;189 }190191if (m_rgba)192 {193delete[] m_rgba;194 m_rgba = NULL;195 }196197for (TCharMap::iterator it = m_chars.begin(); it != m_chars.end(); it++)198 {199delete it->second;200 it->second = NULL;201 }202203 m_chars.clear();204205for (size_t i = 0; i < m_pages.size(); i++)206 {207delete m_pages[i];208 m_pages[i] = NULL;209 }210211 m_pages.clear();212 }213214bool CFontManager::CFont::getCharInfo(int code, glyphMetrics *metrics, GLuint *texture, float coords[]) 215 {216// fast find it217 TCharMap::iterator it = m_chars.find(code);218219if (it != m_chars.end())220 {221 it->second->getInfo(metrics, texture, coords);222return true;223 }224225 glyphMetrics gm;226227if (loadChar(code, &gm) == false)228 {229return false;230 }231232 CChar *ch = new CChar();234 ch->m_code = code;235 ch->setInfo(&gm);236237for (size_t i = 0; i < m_pages.size(); i++)238 {239 CPage *page = m_pages[i];240241if (page->append(gm.width, gm.height, m_rgba, ch->m_coords)) 242 {243 ch->m_texture = page->getTexture();244 ch->getInfo(metrics, texture, coords);245 m_chars.insert(TCharMap::value_type(code, ch));246return true;247 }248 }249250 CPage *page = new CPage();251252if (page->append(gm.width, gm.height, m_rgba, ch->m_coords)) 253 {254 ch->m_texture = page->getTexture();255 ch->getInfo(metrics, texture, coords);256 m_chars.insert(TCharMap::value_type(code, ch));257 m_pages.push_back(page);258return true;259 }260261delete ch;262delete page;263264return false;265 }266267int CFontManager::CFont::getFontTall(void)268 {269return m_tall;270 }271272// bitmap.width 位图宽度273// bitmap.rows 位图⾏数(⾼度)274// bitmap.pitch 位图⼀⾏占⽤的字节数275276//MONO模式每1个像素仅⽤1bit保存,只有⿊和⽩。

基于SDL和OpenGL实时绘制中文字体

基于SDL和OpenGL实时绘制中文字体

0 引 言
当前 , 维 场 景 的 应 用 越 来越 广 泛 , 三 比如 : 屏 幕 的 三 维 全
游 戏 、 维 桌 面 等 。 在 这 些 三 维 场 景 当 中 输 入 并 显 示 中文 成 三 为 必 要 。目前 通 常 的 做 法 是 将 中文 字 体 直 接 显 示 在 二 维 屏 幕 上 , 样 显 示 的 中 文 看 上 去 和 三 维 场 景 并 不 融 洽 , 够将 从输 这 能
关 键 词 三 维 场 景 ; 跨 平 台 图 形库 ; 纹 理 ; 中文 字体 ; 实 时 绘 制
中图法分 类号 : P 9 . T 3 1 9
文献标识 码 : A
文章 编号 :0072 2 1) 82 6.4 10 .04(0 1 0—7 40
Re ltm er n e i gm eh do i e ef n sb s d o DL n a—i e d rn t o fCh n s o t a e n S a d Ope nGL
陈飞,黄海 明,杨猛 ,等 :基 于 S DL和 O e G p n L实时绘制 中文字体
指 定 了 绘 制 的 字 体 颜 色 。这 个 函数 在 绘 制 t t 向的 字 符 串 e 指 x 时 , 据 所 渲 染 的字 符 串 的 长 度 , 及 指 定 的 字 体 的 大 小 , 根 以 会
授 ,研 究 方 向为 智 能 接 口技术 、计 算机 l 学 、虚 拟 现 实 ; 杨 猛 (9 3 ,男 , 山东 曲阜人 ,博 士研 究 生 ,研 究 方 向为 计算 机 图形 学 、虚拟 现 形 18 一) 实 ; 刘 金 刚 (93 ) 男 , 辽宁 铁 岭人 ,教 授 , 博 士生 导 师 ,研 究方 向为 智 能接 口、虚 拟 现 实 。Emal c8 12 @ 13tm 16- , , i f4 2 6 6 .o :

OpenGL绘制直线写汉字

OpenGL绘制直线写汉字

计算机图形学作业2姓名学号班级作业内容用OpenGL绘制直线,写一个自己名字中的汉字效果截图关键程序(<40行) #include <iostream>#include <windows.h>#include <GL/glut.h>using namespace std ;void init(void){glClearColor(0.0, 0.0, 0.0, 0.0) ;glOrtho(0, 1.0, 0, 1.0, -1.0, 1.0) ;}void display(void){glClear(GL_COLOR_BUFFER_BIT);// 将缓存清除为预先的设置值,即黑色glBegin(GL_LINE_STRIP);glVertex2f(0.5, 0.1);//设置第一个顶点的坐标glVertex2f(0.5, 0.9);//设置第二个顶点的坐标glEnd();glBegin(GL_LINE_STRIP);glVertex2f(0.2, 0.5);//设置第一个顶点的坐标glVertex2f(0.8, 0.5);//设置第二个顶点的坐标glEnd();glBegin(GL_LINE_STRIP);glVertex2f(0.3, 0.65);//设置第一个顶点的坐标glVertex2f(0.7, 0.65);//设置第二个顶点的坐标glEnd();glBegin(GL_LINE_STRIP);glVertex2f(0.3, 0.65);//设置第一个顶点的坐标glVertex2f(0.4, 0.8);//设置第二个顶点的坐标glEnd();glBegin(GL_LINE_STRIP);glVertex2f(0.3, 0.65);//设置第一个顶点的坐标glVertex2f(0.225, 0.528);//设置第二个顶点的坐标glEnd();glBegin(GL_LINE_STRIP);glVertex2f(0.5, 0.5);//设置第一个顶点的坐标glVertex2f(0.2, 0.25);//设置第二个顶点的坐标glEnd();glBegin(GL_LINE_STRIP);glVertex2f(0.5, 0.5);//设置第一个顶点的坐标glVertex2f(0.8, 0.2);//设置第二个顶点的坐标glEnd();glFlush();//强制OpenGL函数在有限时间内运行}int main(int argc, char **argv){glutInit(&argc, argv) ;glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB) ;glutInitWindowSize(400, 400) ;glutCreateWindow("朱") ;init() ;glutDisplayFunc(display) ;glutMainLoop() ;return 0 ;}小结通过这次实验,我对OpenGL这个专业又强大的3D图形接口有了一定的了解,它直观易用,并且跨平台性很强,几乎能在所有的主流平台和操作系统上运行;对OpenGL的基本命令语法和程序的基本结构也有了一定的认识,通过老师的讲解和上网查阅资料,终于把自己名字中的“朱”字画出来,基本上掌握了OpenGL中基本几何元素的绘制。

opengl多线程的问题

opengl多线程的问题

opengl多线程的问题 准备给游戏加⼊⼀个Loading画⾯,采⽤多线程,前⾯很顺利,但是就是载⼊后精灵⽆法正常显⽰,看不见纹理,开始以为是使⽤DevIL 库出问题,单步调试发现DevIL载⼊图⽚正常,⽽opengl的glGenTextures出错了,返回的索引总是0。

后来google在gamedev上找到答案,原来opengl不是线程安全的(不知道正确不?),找到了关键⽅向:wglCreateContext.后来在msdn上找到API解释,以及代码实例:HDC hdc;HGLRC hglrc;// create a rendering contexthglrc = wglCreateContext (hdc);// make it the calling thread's current rendering contextwglMakeCurrent (hdc, hglrc);// call OpenGL APIs as desired ...// when the rendering context is no longer needed ...// make the rendering context not currentwglMakeCurrent (NULL, NULL) ;// delete the rendering contextwglDeleteContext (hglrc);只要hdc⼀样,创建的context都会渲染到相同的设备上⾯但是实验很久,都没成功,最后发现是少了⼀个函数:wglShareLists(HGLRC hglrc1, HGLRC hglrc2)注:hglrc1分享hglrc2的资源// 创建多线程// 获取当前hdcHDC hDC = GetDC(hWnd);// 创建渲染contextHGLRC hrc1 = wglCreateContext(hDC);// 分享资源wglShareLists(wglGetCurrentContext(), hrc1);......// 载⼊资源的时候wglMakeCurrent(hDC, hrc1);......// 使⽤后wglMakeCurrent(NULL, NULL);wglDeleteContext(hrc1);。

OpenGL进行文字显示的方法

OpenGL进行文字显示的方法

任何一个DEMO、仿真项目、游戏,都少不了文字这种媒体。

这不可不说是对图形视觉媒体的补充——我们还有一些无法超越文字来向观众表达的心事,或是补充说明,或是感悟,或是感激。

——一般的文字不属于图形渲染部分,而属于用户界面部分,这在游戏引擎中看或许一目了然,但是在底层的图形渲染API——OPENGL或D3D中,文字的显示“并不是必须”,但它是多么深深地被需要着口牙。

所以,把字体设置、文字显示作为一种图形学技术而非单纯的完全我属或他属,我是这么想的。

(同样,拾取也算是这样吧?[乱弹OpenGL选择-拾取机制Ⅰ])本文来源于ZwqXin(/), 转载请注明原文地址:/archives/opengl/opengl-font-setting-showing.html怎么表达文字呢?在OpenGL中,我们没有什么现成的东西可用,但确实有办法让我们“得到这种技术”。

让我最记忆深刻的是NEHE的两三篇教程(貌似都是十几课吧),讲述的就是今天的这个主题。

可以到NEHE网站或者在DANCINGWIND的中文翻译(见[搜集的优良OpenG L教程] )看看~。

而我所知道的这三种方法,前两种应该就是来自那里吧(记得~~),当时要努力完成课程DEMO,于是胡胡混混地就把相应的那两三课学了,而且把它的文字显示方法应用到自己的程序中(还经历了一段艰辛的探索史...连我当时的MyFont类也记录了这份小辛酸,现在看来,是因为当时的知识水平不够理解吧)。

然后后来又一个课程DEMO,老师后来觉得我应该“写中文”,于是我又去探索中文字体显示方法了,并在一个开源DEMO中找到,分析代码段后就拿来主义了,至昨不曾好好考究——这就是我所知的第三种方法。

三种方法都是三步曲:在初始化的时候“创建字体”[Build],在渲染阶段“应用字体”(显示文字)[Print],在程序结束或不再需要文字显示的时候“销毁字体”[kill]。

其中前两步比较重要,着重讨论讨论哈~1. 常规的屏幕字体打印(NormalFont)应用得比较广,大名鼎鼎的AZURE以前的DEMO就是用这个的。

基于多线程的OpenGL渲染方法研究

基于多线程的OpenGL渲染方法研究

基于多线程的OpenGL渲染方法研究
李鑫
【期刊名称】《《微计算机信息》》
【年(卷),期】2005(21)1
【摘要】介绍了Windows下OpenGL编程的基本方法。

对于实时性要求较高的应用场合,提出了一种使用多线程技术OpenGL渲染的方法。

并详细介绍了实现过程,最后给出了一个实例。

【总页数】2页(P185-186)
【作者】李鑫
【作者单位】518122 广东深圳深圳龙岗区光祖中学
【正文语种】中文
【中图分类】TP391.9
【相关文献】
1.基于OpenGL的机场终端区渲染引擎设计与实现 [J], 牟晶
2.基于OpenGL的字幕渲染方法研究 [J], 侯学隆;王宗杰;刘卫东
3.基于OpenGL的海底地形三维渲染方法 [J], 马丹;阳凡林;崔晓东;田会波
4.基于QtOpenGL的大容量图形渲染性能优化研究 [J], 靳慧亮;张波
5.基于OpenGL的三维实时渲染引擎 [J], 罗仁;李子轩
因版权原因,仅展示原文概要,查看原文内容请购买。

qopenglframebufferobject 多线程

qopenglframebufferobject 多线程

qopenglframebufferobject 多线程
QOpenGLFramebufferObject是Qt框架中用于OpenGL帧缓冲的类,它提供了一种方便的方式来创建和管理OpenGL帧缓冲对象。

在多线程环境中使用QOpenGLFramebufferObject时,需要注意一些关键点,以确保线程安全和正确的OpenGL上下文管理。

首先,需要了解的是,OpenGL本身并不是线程安全的。

这意味着在多个线程之间直接共享OpenGL资源可能会导致不可预测的行为或崩溃。

因此,在多线程应用中,每个线程应该使用自己的QOpenGLFramebufferObject实例,并管理自己的OpenGL上下文。

其次,当在多线程中渲染时,需要注意同步问题。

如果多个线程同时尝试写入同一个帧缓冲对象,可能会导致数据竞争和不一致的状态。

为了解决这个问题,可以使用互斥锁(QMutex)或其他同步机制来保护对QOpenGLFramebufferObject的访问。

另外,需要注意的是,每个线程的QOpenGLFramebufferObject实例应该使用自己的纹理、缓冲区对象等OpenGL资源。

这是因为OpenGL资源在跨线程共享时可能会出现问题,而且不同线程的资源可能会互相干扰。

最后,为了避免上下文管理的问题,每个线程的QOpenGLFramebufferObject实例应该使用自己的窗口系统上下文(QOpenGLContext)。

这样可以确保每个线程都有自己的独立OpenGL 上下文,不会出现上下文竞争或状态不一致的情况。

第七章opengl文字显示

第七章opengl文字显示
OpenGL文字显示 (一)显示英文
OpenGL并没有直接提供显示文字的功能,并且,OpenGL也没有自 带专门的字库。因此,要显示文字,就必须依赖操作系统所提供的功能 了。 各种流行的图形操作系统,例如Windows系统和Linux系统,都提供 了一些功能,以便能够在OpenGL程序中方便的显示文字。 最常见的方法就是,我们给出一个字符,给出一个显示列表编号, 然后操作系统由把绘制这个字符的OpenGL命令装到指定的显示列表 中。当需要绘制字符的时候,我们只需要调用这个显示列表即可。假如 我们要显示的文字全部是ASCII字符,则总共只有0到127这128种可能, 因此可以预先把所有的字符分别装到对应的显示列表中,然后在需要时 调用这些显示列表。 Windows系统中,可以使用wglUseFontBitmaps函数来批量的产生显示 字符用的显示列表。函数有四个参数: 第一个参数是HDC,这是Windows GDI的里的东西,调 用wglGetCurrentDC函数,就可以得到一个HDC了。 第二个参数表示第一个要产生的字符,因为我们要产生0到127的字符 的显示列表,所以这里填0。 第三个参数表示要产生字符的总个数,因为我们要产生0到127的字符 的显示列表,总共有128个字符,所以这里填128。 第四个参数表示第一个字符所对应显示列表的编号。假如这里 填1000,则第一个字符的绘制命令将被装到第1000号显示列表,第二个 字符的绘制命令将被装到第1001号显示列表,依次类推。我们可以先 用glGenLists申请128个连续的显示列表编号,然后把第一个显示列表编号 填在这里。 我们为了简化view中的代码,特建立字符显示类COpenGLFont(后面给 出): #define MAX_CHAR 128
(三)三维汉字的显示
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第 3 1卷
第 4期
中 国 民 航 大 学 学 报
J OURNAL OF CI VI L AVI ATI ON UNI VERs I TY OF CHI NA
V0 1 - 31 No . 4 Au g us t 2 0 1 3
2 0 1 3年 8月

种高效 Op e n GL多线程文本 绘制方法
a d v a n t a g e s o f mu l t i — c o r e p r o c e s s o r , a n d a d d o b v i o u s a d v a n t a g e s t o h i g h r e q u i r e me n t o f r e a l - t i me o r l a r g e q u a n - t i t l e s o f t e x t d a t a d r a w i n g . E x p e r i me n t a l r e s u l t s s h o w t h a t t h e a p p l i c a t i o n o f t h i s me t h o d c a n i mp r o v e t e x t d r a wi n g e f f i c i e n c y a n d i mp r o v e u s e r ’ S e x p e r i e n c e . Ke y wo r d s :O p e n G L; GDI ;mu l t i — t h r e a d; t e x t d r a wi n g ;d r a w i n g e f f i c i e n c y
方法效率低 , C P U 占用 量 大 。 考虑 到 Wi n d o w s多线 程 机 制 , 对 上 述 方 法做 出改 进 , 提 出 了一 种 基 于 多线 程 的 O p e n G L文 本绘 制 方 法 。该 方 法 可有 效利 用 多核 处理 器 的 优 势 , 在 对 实 时性 要 求 较 高 或 进行 大批 量 文本 数 据
P r o c e s s i n g , C A U C, T i a n j i n 3 0 0 3 0 0 , C h i n a )
( T i a n j i n K e y L a b o r a t o r y f o r Ad v a n c e d S
me t h o d f o r t e x t d r a wi n g i n O p e n G L b a s e d o n mu l t i - t h r e a d i s p r o p o s e d . T h i s me t h o d c a n e f f e c t i v e l y u t i l i z e t h e
Co n s i d e r i n g t h e f e a t u r e o f Wi n d o ws mu l t i - t h r e a d i n g me c h a n i s m ,s o me i mp r o v e me n t s a r e ma d e,a n d a n e w
Ef ic f i e n t me t ho d f o r mu l t i -t hr e a d t e x t dr a wi ng b a s e d o n Op e nGL
Re n — b ቤተ መጻሕፍቲ ባይዱ a o ,
Ha i - n i n g ,Q uJ i n g - y i , J I A Y u n - f e i
吴仁彪 , 吴 海宁 , 屈景怡 , 贾云飞
( 中国民航 大学智 能信号与 图像 处理天 津市重点 实验 室, 天津 3 0 0 3 0 0 )
摘 要 : O p e n G L库 没 有提 供 直接 的 文 本 显 示和 处理 函数 , 文献 【 4 1 给 出一 种 基 于 G D I的 O p e n G L文本 绘 制 方 法 . 但 该
绘 制 等 方 面有 明显 优 势 。 实验 结 果 表 明 , 使 用此 方法 能 够 有 效 提 高 文 本绘 制 效 率 . 改 善 用 户体 验 。
关键词 : O p e n G L ; G D I ; 多线 程 : 文本绘制 ; 绘 制 效 率 中图分类号 : T P 3 9 l 文献标志码 : A 文章 编 号 :1 6 7 4 — 5 5 9 0 ( 2 0 1 3 l 0 4 — 0 0 2 3 — 0 4
Ab s t r a c t :T h e O p e n GL L i b r a r y h a s n o t o f f e r t h e f u n c t i o n o f t e x t d i s p l a y a n d p r o c e s s i n g d i r e c t l y . L i t e r a t u r e 4 p r o v i d e d a me t h o d o f Op e n GL d r a w i n g t e x t b a s e d o n GDI , b u t t h e e ic f i e n c y wa s l o w a n d o c c u p i e d t o o mu c h o f CP U t i me .
相关文档
最新文档