天天看点

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);                 

}