感謝《學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);
}