当然国外有POWERVR提供基于OPENGL ES的SDK封装的APPPRINT3D类来处理字符串显示和GLFONT for windows ce等。
但是我们这里只整理了一个函数:
void glTextShow(WCHAR *fontname, int fontsize, int style, int x, int y, const WCHAR *string)
{
int len, xx = 0, yy = 0, nbpoints = 0, i;
GLshort *points;
GLushort *indices;
HFONT font;
LOGFONTW lf;
RECT rect;
static HBITMAP bmp;
static BYTE *img;
static HDC hdc = NULL;
static BITMAPINFO bi;
SIZE sz;
static EGLint width, height;
if(!fontname || !string)
return;
if(!string[0])
return;
if(!hdc)
{
hdc = CreateCompatibleDC(GetDC(hWnd));
eglQuerySurface(eglDisplay, eglSurface, EGL_WIDTH, &width);
eglQuerySurface(eglDisplay, eglSurface, EGL_HEIGHT, &height);
ZeroMemory(&bi, sizeof(BITMAPINFO));
bi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
bi.bmiHeader.biWidth = width;
bi.bmiHeader.biHeight = height;
bi.bmiHeader.biBitCount = 8;
bi.bmiHeader.biPlanes = 1;
bi.bmiHeader.biCompression = BI_RGB;
bmp = CreateDIBSection(hdc, &bi, DIB_RGB_COLORS, &img, NULL, 0);
SelectObject(hdc, bmp);
SelectObject(hdc, GetStockObject(BLACK_BRUSH));
SetBkMode(hdc, TRANSPARENT);
SetTextColor(hdc, RGB(255, 255, 255));
}
Rectangle(hdc, 0, 0, width, height);
ZeroMemory(img, width * height);
lf.lfCharSet = DEFAULT_CHARSET;
lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
lf.lfEscapement = 0;
wcscpy(lf.lfFaceName, fontname);
lf.lfHeight = -(fontsize * GetDeviceCaps(GetDC(hWnd), LOGPIXELSY) / 72);
lf.lfItalic = (style & 1) ? TRUE : FALSE;
lf.lfOrientation = 0;
lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
lf.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
lf.lfQuality = DEFAULT_QUALITY;
lf.lfStrikeOut = FALSE;
lf.lfUnderline = (style & 4) ? TRUE : FALSE;
lf.lfWidth = 0;
lf.lfWeight = (style & 2) ? FW_BOLD : FW_NORMAL;
font = CreateFontIndirectW(&lf);
SelectObject(hdc, font);
len = wcslen(string);
GetTextExtentPointW(hdc, string, len, &sz);
rect.left = max(0, min(x, width));
rect.top = max(0, min(y, height));
rect.right = min(rect.left + sz.cx, width);
rect.bottom = min(rect.top + sz.cy, height);
DrawTextW(hdc, string, len, &rect, DT_LEFT | DT_BOTTOM);
points = (GLshort*)malloc(sz.cx * sz.cy * 2 * sizeof(short));
for(yy = rect.top; yy < rect.bottom; yy++)
{
for(xx = rect.left; xx < rect.right; xx++)
{
if(img[xx + (height - yy) * width] != 0)
{
points[nbpoints * 2 + 0] = xx - x;
points[nbpoints * 2 + 1] = (short)(rect.top + sz.cy - (yy - rect.top)) - y;
nbpoints++;
}
}
}
DeleteObject(font);
indices = (GLushort*)malloc(nbpoints * sizeof(GLushort));
for(i = 0; i < nbpoints; i++)
indices[i] = i;
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrthox(0, _INT2FIXED(width),
0, _INT2FIXED(height),
0, _INT2FIXED(1));
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glDisable(GL_DEPTH_TEST);
glTranslatex(_INT2FIXED(x), _INT2FIXED(y), 0);
glEnable(GL_ALPHA_TEST);
glAlphaFuncx(GL_NOTEQUAL, 0);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glEnableClientState (GL_VERTEX_ARRAY);
glVertexPointer(2, GL_SHORT, 0, points);
glDrawElements(GL_POINTS,
nbpoints,
GL_UNSIGNED_SHORT,
indices);
glDisable(GL_ALPHA_TEST);
glEnable(GL_DEPTH_TEST);
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
free(indices);
free(points);
}
谢谢支持!
分享到:
相关推荐
NULL 博文链接:https://yarin.iteye.com/blog/626025
本示例将探讨如何在OpenGL ES环境中实现GIF动图的显示。 首先,了解GIF格式至关重要。GIF是一种支持动画的图像格式,通过一系列连续的静态图像构成动态效果。它包含一个图像头部、全局颜色表、逻辑屏幕描述符、图像...
本教程主要探讨如何在Android系统上,利用OpenGLES2.0图形库来处理和显示从Camera获取的YUV原始数据。YUV是一种常见的颜色空间,广泛应用于视频编码和解码,因为它对带宽的要求相对较低,特别适合移动设备。 首先,...
这篇文章将深入探讨如何在旧代码基础上添加OpenGL ES2.0以实现点云显示功能,同时也会涉及与之相关的技术——QT、OpenCV。首先,OpenGL ES(OpenGL for Embedded Systems)是OpenGL的一个子集,专为嵌入式设备如智能...
在Android应用中,如果你想使用OpenGL ES显示YUV格式的图片,你需要遵循以下步骤: 1. **数据提取**:首先,你需要从YUV数据中提取出Y、U、V三个分量。Y分量代表亮度,U和V代表色度,它们通常以4:2:0的采样率存储,...
在这个“OpenGlEs显示纹理例子程序”中,我们将探讨如何在Android平台上利用OpenGL ES来显示图像纹理,特别关注BMP格式的图像。 首先,理解OpenGL ES的基础是关键。它是一个状态机,通过一系列的函数调用来改变渲染...
通常,Windows系统原生支持的是OpenGL而非OpenGL ES,因此对于需要在Windows平台上测试或开发针对OpenGL ES的应用程序的开发者来说,这样的模拟器是必不可少的工具。这个模拟器适用于64位系统,意味着即使在64位环境...
自己做过精简,适合做动画,视频播放,纹理加载方式可以根据自己的需求改动。
它通常与OpenGL ES不直接交互,但在构建例如3D地理信息系统或可视化应用时,可能会利用Elasticsearch来检索和组织数据,然后通过OpenGL ES进行呈现。 总的来说,OpenGL ES 3.0编程指南涵盖了移动和嵌入式设备图形...
Arm Mali OpenGL ES Emulator v3.0.1.g72cc2-Windows-64bit.zip是一款专为64位Windows系统设计的高性能图形处理工具,主要用于模拟Arm Mali系列GPU的OpenGL ES 3.0环境。这款软件的核心目标是为开发者提供一个可靠的...
OpenGL ES 3.0编程指南是面向初学者的优秀教程,旨在帮助读者深入理解并掌握OpenGL ES 3.0这一移动设备和嵌入式系统上的图形处理标准。OpenGL ES(Embedded Systems)是OpenGL的轻量级版本,专为资源有限但需要高...
### OpenGL ES 3.0.2 规范详解 #### 一、概述 OpenGL ES (Open Graphics Library for Embedded Systems) 是一种专为嵌入式设备设计的图形渲染库,广泛应用于移动设备、游戏主机和其他资源受限的系统。OpenGL ES ...
同时,通过QFont和QFontMetrics来处理文字的布局和尺寸,然后使用OpenGL的顶点数组和顶点着色器将字符转换为几何形状并绘制到屏幕上。 接下来,我们讨论“透视投影”。在3D图形中,透视投影能模拟人眼观察物体的...
Qt+openglEs2加载3D模型Qt+openglEs2加载3D模型Qt+openglEs2加载3D模型Qt+openglEs2加载3D模型Qt+openglEs2加载3D模型Qt+openglEs2加载3D模型Qt+openglEs2加载3D模型Qt+openglEs2加载3D模型Qt+openglEs2加载3D模型Qt...
_opengles2.tar.gz"压缩包包含了跨平台的OpenGL ES 2.0代码,意味着你可以在这两个操作系统上编译和运行它。 在Windows和Linux系统中编译OpenGL ES 2.0代码,你需要一些关键的开发工具和库。在Windows环境下,你...
在WinCE(Windows Embedded Compact)平台上支持OpenGL ES,意味着可以为这些移动设备提供更强大的图形功能和更丰富的用户体验。 WinCE Mobile OpenGL ES的实现通常涉及到以下几个关键知识点: 1. **API接口**:...
这个特定的项目旨在通过JNI调用来结合这两个强大的库——OpenGL ES用于图形渲染,OpenCV用于图像处理,从而在Android设备上显示一幅图片。 OpenGL ES是OpenGL的嵌入式版本,主要用于移动设备和嵌入式系统。它是...
本程序是使用FreeType2.0库, 在OpenGL中显示文字, 若字库文件支持unicode, 则可显示汉字等东亚字符, 本程序是本人为嵌入式系统所写的一个原型程序,若加上着色器,便可很容易移植到OPenGL ES2.0
6. **渲染循环**:在循环中,使用OpenGL ES API绘制图形,然后通过GBM和DRM提交缓冲区到显示设备。 7. **交换缓冲区**:在某些系统中,可能需要交换前后缓冲区以实现无闪烁的动画效果。 8. **清理**:最后,释放...