OPENGL文字显示

感谢《学OPENGL编3D游戏》教学课件。这个课件在GAMERES上可以得到。其中有一种显示文字的方法。主要是利用了glBitmap。思路如下:先创建一个临时DC,将文字写到这个DC上。文字背景色为黑色,颜色为白色。这样就得到了文字对应的黑白图,最后把这个黑白图绘制到指定区域。通过在glBitmap之前,用glColor3f指定颜色,最后显示出有颜色的文字。此外,坐标转换也很巧妙:

 glTranslatef(-(420-x)/800,(260-y)/600,-1.0f);

这个公式,文字的坐标轴原点位于窗口左上角,横坐标向右,纵坐标向下。

附:课件中的源码。

void CGLFont:: settext (float x,float y,CString str,HFONT Font,float r,float g,float b)
{
 glLoadIdentity();
 glPushAttrib(GL_CURRENT_BIT);
 glDisable(GL_TEXTURE_2D);   
 glDisable(GL_LIGHTING);     
 
 //指定颜色
 glColor3f(r,g,b);            
 //坐标转换,移动
 glTranslatef(-(420-x)/800,(260-y)/600,-1.0f);
 //输出文字
 Printftext (0,0, str,Font);  
 
 glEnable(GL_LIGHTING);        
 glEnable(GL_TEXTURE_2D);         
 glPopAttrib();
}

void CGLFont:: Printftext (int x, int y, LPCTSTR lpszText,HFONT hFont)
{
 CBitmap bitmap;      
 BITMAP bm;                          
 SIZE size;                         
 
 HDC MDC = ::CreateCompatibleDC(0);
 SelectObject(MDC,hFont);   
 ::GetTextExtentPoint32(MDC,lpszText,strlen(lpszText),&size);
 
 bitmap.CreateBitmap(size.cx, size.cy, 1, 1, NULL);
 
 HBITMAP oldBmp=(HBITMAP)SelectObject(MDC,bitmap);
 
 SetBkColor  (MDC, RGB(0,     0,   0)); 
 SetTextColor(MDC, RGB(255, 255, 255)); 
 TextOut(MDC, 0, 0, lpszText, strlen(lpszText));
 
 bitmap.GetBitmap(&bm);    
 size.cx = (bm.bmWidth + 31) & (~31);  
 int bufsize =size.cy * size.cx; 
 
 struct {
  BITMAPINFOHEADER bih;
  RGBQUAD col[2];
    }bic;                                
 BITMAPINFO *binf = (BITMAPINFO *)&bic;      
 binf->bmiHeader.biSize     = sizeof(binf->bmiHeader);
 binf->bmiHeader.biWidth    = bm.bmWidth; 
 binf->bmiHeader.biHeight   = bm.bmHeight; 
 binf->bmiHeader.biPlanes   = 1;        
 binf->bmiHeader.biBitCount = 1;            
 binf->bmiHeader.biCompression = BI_RGB;    
 binf->bmiHeader.biSizeImage   = bufsize;
 UCHAR* Bits = new UCHAR[bufsize];   
 ::GetDIBits(MDC,bitmap,0,bm.bmHeight,Bits,binf,DIB_RGB_COLORS);
                                         
 glPixelStorei(GL_UNPACK_ALIGNMENT ,1);
 glRasterPos2i(x,y);                 
 glBitmap(size.cx,size.cy,0,0,0,0,Bits);
 
 delete Bits;                           
 SelectObject(MDC, oldBmp);          
 ::DeleteDC(MDC);                 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值