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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章