【原创】OPENGL ES显示字符串

使用OPENGL ES开发一个应用,显示字符串都那么麻烦,虽然POWERVR等基于OPENGL ES的SDK提供了APPPRINT3D这样的封装类来处理字符串显示,但鉴于开发中我用的不是POWERVR。网上还有一个封装好的类,glfonts for WINCE,把这个类放到程序中,也不知道是否自己的使用是否正确,反正没啥效果。最后发现可以通过这么一种方式实现,首先把字符串打印在dc上,然后生成位图,最后位图纹理贴图。All works are done.

    1 void  glTextShow(WCHAR *fontname, int fontsize, int style, int x, int y, const WCHAR *string)

  2  {
  3       int  len, xx  =   0 , yy  =   0 , nbpoints  =   0 , i;
  4      GLshort  * points;
  5      GLushort  * indices;
  6      HFONT font;
  7      LOGFONTW    lf;    
  8      RECT rect;
  9       static  HBITMAP bmp;
 10       static  BYTE  * img;
 11       static  HDC hdc  =  NULL;
 12       static  BITMAPINFO bi;
 13      SIZE sz;
 14       static  EGLint width, height;
 15 
 16       if ( ! fontname  ||   ! string )
 17           return ;
 18       if ( ! string [ 0 ])
 19           return ;
 20 
 21       if ( ! hdc)
 22      {        
 23          hdc  =  CreateCompatibleDC(GetDC(hWnd));    
 24          
 25          eglQuerySurface(eglDisplay, eglSurface, EGL_WIDTH,  & width);
 26          eglQuerySurface(eglDisplay, eglSurface, EGL_HEIGHT,  & height);
 27 
 28         
 29          ZeroMemory( & bi,  sizeof (BITMAPINFO));
 30          bi.bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
 31          bi.bmiHeader.biWidth  =  width;
 32          bi.bmiHeader.biHeight  =  height; 
 33          bi.bmiHeader.biBitCount  =   8 ;
 34          bi.bmiHeader.biPlanes  =   1 ;
 35          bi.bmiHeader.biCompression  =  BI_RGB;
 36          
 37          bmp  =  CreateDIBSection(hdc,  & bi, DIB_RGB_COLORS,  & img, NULL,  0 );
 38      
 39          SelectObject(hdc, bmp);
 40          
 41          SelectObject(hdc, GetStockObject(BLACK_BRUSH));
 42 
 43          SetBkMode(hdc, TRANSPARENT);
 44          SetTextColor(hdc, RGB( 255 255 255 ));            
 45      }
 46 
 47      Rectangle(hdc,  0 0 , width, height);
 48      ZeroMemory(img, width  *  height);
 49 
 50      lf.lfCharSet  =  DEFAULT_CHARSET;
 51      lf.lfClipPrecision  =  CLIP_DEFAULT_PRECIS;
 52      lf.lfEscapement  =   0 ;
 53      wcscpy(lf.lfFaceName, fontname);
 54      lf.lfHeight  =   - (fontsize  *  GetDeviceCaps(GetDC(hWnd), LOGPIXELSY)  /   72 );
 55      lf.lfItalic  =  (style  &   1 ?  TRUE : FALSE;
 56      lf.lfOrientation  =   0 ;
 57      lf.lfOutPrecision  =  OUT_DEFAULT_PRECIS;
 58      lf.lfPitchAndFamily  =  DEFAULT_PITCH  |  FF_DONTCARE;
 59      lf.lfQuality  =  DEFAULT_QUALITY;
 60      lf.lfStrikeOut  =  FALSE;
 61      lf.lfUnderline  =  (style  &   4 ?  TRUE : FALSE;
 62      lf.lfWidth  =   0 ;
 63      lf.lfWeight  =  (style  &   2 ?  FW_BOLD : FW_NORMAL;
 64      
 65      font  =  CreateFontIndirectW( & lf);
 66 
 67      SelectObject(hdc, font);
 68 
 69      len  =  wcslen( string );
 70 
 71      GetTextExtentPointW(hdc,  string , len,  & sz);
 72 
 73      rect.left  =  max( 0 , min(x, width));
 74      rect.top  =  max( 0 , min(y, height));
 75      rect.right  =  min(rect.left  +  sz.cx, width);
 76      rect.bottom  =  min(rect.top  +  sz.cy, height);
 77 
 78      DrawTextW(hdc,  string , len,  & rect, DT_LEFT  |  DT_BOTTOM);
 79      
 80      points  =  (GLshort * )malloc(sz.cx  *  sz.cy  *   2   *   sizeof ( short ));
 81 
 82       for (yy  =  rect.top; yy  <  rect.bottom; yy ++ )
 83      {
 84           for (xx  =  rect.left; xx  <  rect.right; xx ++ )
 85          {
 86               if (img[xx  +  (height  -  yy)  *  width]  !=   0 )
 87              {
 88                  points[nbpoints  *   2   +   0 =  xx  -  x;
 89                  points[nbpoints  *   2   +   1 =  ( short )(rect.top  +  sz.cy  -  (yy  -  rect.top))  -  y;
 90                  nbpoints ++ ;
 91              }
 92          }
 93      }
 94      DeleteObject(font);
 95      
 96      indices  =  (GLushort * )malloc(nbpoints  *   sizeof (GLushort));
 97       for (i  =   0 ; i  <  nbpoints; i ++ )
 98          indices[i]  =  i;
 99 
100      glMatrixMode(GL_PROJECTION);
101      glPushMatrix();
102      glLoadIdentity(); 
103 
104      glOrthox( 0 , _INT2FIXED(width), 
105               0 , _INT2FIXED(height), 
106               0 , _INT2FIXED( 1 ));
107 
108 
109      glMatrixMode(GL_MODELVIEW);
110      glPushMatrix();
111      glLoadIdentity(); 
112 
113      glDisable(GL_DEPTH_TEST);
114      
115      glTranslatex(_INT2FIXED(x), _INT2FIXED(y),  0 );    
116      
117      glEnable(GL_ALPHA_TEST);
118      glAlphaFuncx(GL_NOTEQUAL,  0 );
119      glDisableClientState(GL_TEXTURE_COORD_ARRAY);
120      glDisableClientState(GL_COLOR_ARRAY);
121      glDisableClientState(GL_NORMAL_ARRAY);
122      glEnableClientState (GL_VERTEX_ARRAY);
123      glVertexPointer( 2 , GL_SHORT,  0 , points);
124 
125      glDrawElements(GL_POINTS,
126                          nbpoints,
127                          GL_UNSIGNED_SHORT,
128                          indices);
129      
130      glDisable(GL_ALPHA_TEST);
131 
132      glEnable(GL_DEPTH_TEST);
133 
134      glPopMatrix();
135      glMatrixMode(GL_PROJECTION);
136      glPopMatrix();
137      glMatrixMode(GL_MODELVIEW);
138 
139      free(indices);
140      free(points);
141  }

 

 

转载于:https://www.cnblogs.com/IamEasy_Man/archive/2009/12/25/1632395.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值