WINCE使用OpengL ES 显示文字的实现
WINCE使用OpengL ES 显示文字的实现
2011年04月01日
使用OpengL ES 显示文字对opengl es 初学者来说,可谓一个不大不小的麻烦。有人是利用了Opengl ES API封装了一些dll库来实现,例如glfont,不过用起来就像浮云,很不灵活。这里简单描述下,我在wince上实现opengl es显示文字的思路。显示文字的实质其实也就是显示一张纹理,显示一个纹理很简单,那么我们的重点即是如何产生一个上面写有文字的纹理。 实现的思路是这样的: 1.创建一张与设备相关的GDI位图。 2.创建一个兼容DC,把步骤1创建的位图选入到DC中。 3.调用GDI,DrawText等把文字画到步骤2创建的DC上(可以用Truetype实现更加平滑的漂亮文字)。 4.利用此已画好文字的DC,再创建一个设备无关的位图,并用其像素数据生成纹理。 补充:对于需要把文字写在一个底图上的情况,我想也不用多述了吧,需要进行透明的文字显示时,亦可在此思路上略做补充就得了。 下面给出参考代码,注意代码的组织顺序跟我上面说的思路有点出入。 bool CDrawText::CreateText(CString strText,GLuint *id) //创建文字纹理无底图 { CRect TextOffsetRect; if(m_bDown) TextOffsetRect = m_ActiveOffsetRect; else TextOffsetRect = m_OffsetRect; int TextWidth = m_EffectRect.Width(); //图片宽度 int TextHeight = m_EffectRect.Height(); //图片高度 CFont m_font; m_font.CreateFont(m_FontSize, /*Attach(GetHDC()); //定义指向DIB数据区的指针 BYTE *lpBitmapBits = NULL; CDC dcMem; //绘制最终结果的DC dcMem.CreateCompatibleDC(pDC); HDC hMemDC = dcMem.GetSafeHdc(); BITMAPINFO bitInfo; bitInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER); bitInfo.bmiHeader.biWidth=TextWidth; bitInfo.bmiHeader.biHeight=-TextHeight; bitInfo.bmiHeader.biPlanes=1; bitInfo.bmiHeader.biBitCount=24; bitInfo.bmiHeader.biCompression=BI_RGB; bitInfo.bmiHeader.biSizeImage=0; bitInfo.bmiHeader.biXPelsPerMeter=0; bitInfo.bmiHeader.biYPelsPerMeter=0; bitInfo.bmiHeader.biClrUsed=0; bitInfo.bmiHeader.biClrImportant=0; bitInfo.bmiColors[0].rgbBlue=255; bitInfo.bmiColors[0].rgbGreen=255; bitInfo.bmiColors[0].rgbRed=255; bitInfo.bmiColors[0].rgbReserved=255; //创建位图 HBITMAP directBmp = CreateDIBSection(hMemDC, (BITMAPINFO*)&bitInfo, DIB_RGB_COLORS, (void **)&lpBitmapBits, NULL, 0); HGDIOBJ previousObject = SelectObject(hMemDC, directBmp); CBitmap bmp; bmp.CreateCompatibleBitmap(pDC,TextWidth,TextHeigh t); CDC dcBmp; //后台绘制图片的DC,最终要将此DC Blt到dcMem中 dcBmp.CreateCompatibleDC(pDC); CBitmap* COldBitamp = (CBitmap*)dcBmp.SelectObject(&bmp); HDC hBmpDC = dcBmp.GetSafeHdc(); /* img.Draw2(dcBmp.GetSafeHdc(),0,0,iImgWidth,iImgHei ght); //绘制图片到BmpDC中*/ dcBmp.FillSolidRect(CRect(0,0,TextWidth,TextHeight ),m_BackColor); int len=strText.GetLength(); CFont* COldFont = (CFont*)dcBmp.SelectObject(&m_font); dcBmp.SetBkMode(TRANSPARENT); if(!m_bDown) dcBmp.SetTextColor(m_FontColor); else dcBmp.SetTextColor(m_ActiveFontColor); dcBmp.DrawText(strText,len,&TextOffsetRect,m_uAlig n); BitBlt(hMemDC,0,0,TextWidth,TextHeight,hBmpDC,0,0, SRCCOPY); int tmpPower = 2; bool bGetW = false,bGetH = false; while (true) { if (TextWidth > 3;//左移三位即除以8,获取图像每像素字节数 int linepos = 0; for (int i=m_wBkImgy-1;i>=m_wBkImgy-TextHeight;i--)// { lpLine = lpData + (linepos++) * nPitch; for(int j = 0; j Detach(); pDC->DeleteDC(); delete pDC; return true; }