OPENGL ES显示字符串(Windows Mobile)

当然国外有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);
}

谢谢支持! 

国产显卡JM7201与银河麒麟V10下Godot引擎性能优化实战 在计算机图形学与游戏开发领域,渲染性能优化是确保应用流畅运行的核心技术。其原理在于平衡CPU与GPU的计算负载,通过减少绘制调用、优化资源管理和调整渲染管线来提升帧率。这项技术的价值在于,它能让应用在性能受限的硬件上依然提供可用的交互体验,尤其在嵌入式系统、教育设备和国产化软硬件平台等场景中至关重要。本文聚焦于在景嘉微JM7201显卡和银河麒麟V10操作系统这一特定国产化技术栈上,对开源游戏引擎Godot进行深度性能调优的工程实践,通过一系列针对性的优化策略,有效解决了低性能显卡环境下的卡顿与掉帧问题。 阅读详情

相关推荐

Godot游戏资源打包优化:基于GodotPckTool构建高效多平台发布系统

在游戏开发中,资源打包是优化游戏性能、简化分发流程和保护知识产权的关键技术环节。其核心原理是将游戏所需的纹理、音频、场景等资源文件整合为单一容器文件,通过减少文件系统I/O操作和统一压缩格式来提升加载效率与运行性能。这项技术的工程价值在于实现资源管理的自动化与平台适配,尤其对于多平台发布的商业项目,能够针对不同硬件(如PC的BC7纹理与移动端的ETC2/ASTC纹理)进行专项优化。典型的应用场景包括中大型游戏的跨平台发布、热更新支持以及持续集成流水线。本文以Godot引擎为例,深入解析如何利用GodotPc

weixin_34327761的博客 446

OpenGL -文字

OpenGL 文字

weixin_45054115的博客 3386

OpenGL ES显示字符串2(Windows Mobile)

NULL 博文链接:https://yarin.iteye.com/blog/626025

opengl es2.0 渲染文字

这篇文章是我写在公司项目组的博客下的. 在OpenGL 家族中是没有提供直接渲染文字的接口,所以我们要在opengl中显示文字,就需要借助于其他的三方库或者自己解析绘制文字,然后使用opengl中的绘制接口去渲染出文字 这里我使用的freetype这个三方库· FreeType 2.0 FreeType是一个完全开源的、可扩展、可定制且可移植的字体引擎,它提供True

tlglove326的博客 6043

OpenGL ES 2.0 Programming Guide 编程指南 pdf 矢量文字 中英文合集

OpenGL ES 2.0 编程指南 合集,压缩包包含中英文电子版,均为矢量电子版,可复制文字。

Power BI Report Server自定义登录实战:从AD切换到Form的完整流程(附GitHub源码)

本文详细介绍了如何将Power BI Report Server的登录认证从Active Directory切换到自定义Form认证的完整流程。通过环境准备、认证模块编译、配置脚本修改等步骤,帮助用户实现品牌统一的登录界面和简化外部用户访问。附有GitHub源码,适用于需要个性化登录解决方案的企业。

pz890123456的博客 209

【OpenGL】显示字符

很多时候,我们需要在创建的窗口上显示一些提示信息。这个时候我们可用的一种常用方法就是加载一幅包含常用字符的bmp图像作为纹理来实现。 下面介绍具体步骤: (1)加载bmp图像作为纹理。 采用的bmp图像Font.bmp: 采用了glaux库。 具体实现参考:加载BMP图像为纹理 (2)创建显示列表 需要注意的是图像Font.bmp大小是256*256,包含两种格式的字符,...

mmdev 576

用C#和MQTTnet在WinForm里做个简易物联网监控后台(附完整源码)

本文详细介绍了如何使用C#和MQTTnet库在WinForm中构建一个简易物联网监控后台。通过实战案例,包括环境配置、MQTT服务端实现、客户端监控功能及高级优化技巧,帮助开发者快速搭建高效的物联网监控系统,适用于工业自动化和智能家居场景。

weixin_29540599的博客 392

OpenGL ES详解——文字渲染

FreeType的这些度量值中包含了字形在相对于基线上的偏移量用来描述字形相对于此基线的位置,字形的大小,以及与下一个字符之间的距离。当你想要使用不同的字体时,你不得不重新生成位图字体,以及你的程序会被限制在一个固定的分辨率:如果你对这些文字进行放大的话你会看到文字的像素边缘。然而,你的应用程序可能并不需要这么强大的功能,性能更好的点阵字体也许是更可取的。通常这并不会出现什么问题,因为通常的纹理都有4或者4的整数倍的储存大小,但是现在我们只用一位来表示每一个像素颜色,此时的纹理可能有任意内存长度。

闲暇部落 2375

SAP S4 MM模块自动记账全流程解析:从评估范围到科目分组的实战配置

本文深入解析SAP S4 MM模块自动记账的全流程,从核心概念评估范围与评估控制入手,详细阐述了评估类、科目分组等关键配置的逻辑关系。通过实战配置步骤,指导如何建立从物料移动(如收货、发料)到自动生成准确财务凭证的完整体系,确保库存价值与总账实时同步,为企业构建可靠的财务业务一体化基石。

weixin_29313547的博客 422

图文实录|大规模预训练模型:探讨与展望

第二期「澜舟分享会」我们邀请到来自复旦大学计算机学院邱锡鹏教授分享了“大规模预训练模型:探讨与展望”,本此演讲主要围绕大规模预训练语言模型展开讨论,并探讨大模型成功的原因、适用场景、未来发展方向以及身处大模型时代我们的机遇。

langboat_mengzi的博客 1204

Unity WebGL模型优化全攻略:从建模到渲染的性能提升实践

在WebGL开发中,模型优化是提升应用性能与用户体验的关键环节。其核心原理在于,WebGL运行于浏览器沙箱环境,受限于单线程架构、严格的内存管理及网络加载特性,对资源体积与运行时效率提出了苛刻要求。这项技术的核心价值在于,通过系统性的优化手段,能显著减少应用包体、降低内存占用、提升渲染帧率,从而确保内容在各类网络与设备条件下流畅运行。典型的应用场景包括H5小游戏、互动营销页面、在线展厅及轻量化3D应用等。本文聚焦于Unity引擎的WebGL发布,深入探讨了针对模型网格、纹理贴图、渲染管线及资产加载的全链路优

既是过河之卒,惟有奋力向前。 512

YOLOv8改进:卷积篇 | 保姆级探索动态蛇形卷积 (Dynamic Snake Convolution) 的实现与应用

动态蛇形卷积是一种新的卷积操作,它能够更好地捕捉图像中的细节信息。传统卷积核的形状和大小是固定的,而动态蛇形卷积则允许卷积核在不同的位置动态调整其形状,以更好地适应输入数据的特点。这种灵活性使得动态蛇形卷积在处理复杂背景和细节丰富的图像时具有显著优势。我们先定义一个基本的动态蛇形卷积模块。这个模块将作为YOLOv8卷积层的替代。为了全面集成动态蛇形卷积,我们需要修改YOLOv8的模型定义,将所有的基础卷积层替换为我们的SnakeConv模块。

一键难忘的博客 5481
上一篇: 《Android应用开发揭秘》连载2
下一篇: 《Android应用开发揭秘》连载3
yarin
博客等级 码龄17年 35粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值