opengl 绘制 ttf 字符串时间:2022-04-12 22:33:23 void SystemFont::drawString(Graphics* g, const char* text,int x, int y,int anchor) { u16* unitext = utf82unicode(text); u16* unitextP = unitext; int len = 0; SDL_Color color; while(*unitextP != 0){ if(fontImgMap.find(*unitextP)!=fontImgMap.end()){ Image* img = (Image *)fontImgMap[*unitextP]; drawImage(img,x+len,y,anchor); len += img->getWidth(); unitextP++; continue; } u16 aUni[2] ; aUni[0] = *unitextP; aUni[1] = 0; SDL_Surface* fontSurface = TTF_RenderUNICODE_Solid(ttfFont,aUni, color); int w = intToPowerOfTwo(fontSurface->w); int h = intToPowerOfTwo(fontSurface->h); GLuint oldTex; glGetIntegerv(GL_TEXTURE_BINDING_2D, (GLint*)&oldTex); SDL_Surface* tmp = ::SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 32, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xff000000); SDL_BlitSurface(fontSurface, NULL, tmp, NULL); GLuint tex; glGenTextures(1, &tex); glBindTexture(GL_TEXTURE_2D, tex); glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, tmp->pixels); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); Image* img = Image::createImage(tex,fontSurface->w,fontSurface->h,w,h); fontImgMap[*unitextP] = img; glBindTexture(GL_TEXTURE_2D, oldTex); SDL_FreeSurface(tmp); SDL_FreeSurface(fontSurface); drawImage(img,x+len,y,anchor,-1); len += img->getWidth(); unitextP++; } 由于字符图片只有alpha值,在绘制时glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);则会与你原先设置的gl颜色混合,得到该颜色的字符