我有一种情况,我需要在openGL窗口上打印动态文本(每20毫秒更新一次)。我正在使用QGLWidget,其中paintGL方法是使用本机openGL命令实现的。我尝试使用renderText,但发现定位文本有问题。所以我决定采用渲染位图文本的方法。对于要绘制的每个文本,我将创建一个QImage并渲染此图像。一切都按照正确尺寸在正确位置呈现的预期文本工作。到现在为止还挺好。但是(一个很大的一个:P),如果我查看我的应用程序内存扩展,即使没有更新可用,它也会增长和增长。我对在动态情况下使用bindTexture接口持怀疑态度。编译图像纹理可以使用吗?有人帮我理解这个问题。并提供一些可能的解决方案:)
void DrawText(Pos_st f_img_pos, Rot_st f_img_Rot, Dimensions_st f_Img_Dim, QString Text)
{
Rot_st f_img_Rot1;
QImage f_TextImg(fontImageWidth, fontImageHeight,QImage::Format_ARGB8555_Premultiplied);
QPainter f_Painter(&f_TextImg);
f_Painter.setCompositionMode(QPainter::CompositionMode_Source);
f_Painter.setBrush(Qt::transparent);
f_Painter.fillRect(f_TextImg.rect(), Qt::transparent);
f_Painter.setPen(QColor(f_Color.g_Red_sfl32 * 255 , f_Color.g_Green_sfl32 * 255 ,
f_Color.g_Blue_sfl32 * 255));
f_Painter.setFont(QFont(Text, f_TextFont_st.g_FontSize_si32,
f_TextFont_st.g_FontConst_enm));
f_Painter.drawText(f_TextImg.rect(), Qt::AlignCenter, Text);
LoadPicture(f_img_pos, f_img_Rot1, f_Img_Dim, bindTexture(f_TextImg));
}
void LoadPicture(Pos_st f_img_pos, Rot_st f_img_Rot, Dimensions_st f_img_Dim, GLuint f_Img_ID )
{
glTranslated( f_img_pos.g_XPOS_sfl32 , f_img_pos.g_YPOS_sfl32 , f_img_pos.g_ZPOS_sfl32 );
glRotatef( f_img_Rot.g_Angle_sfl32 , f_img_Rot.g_XROT_sfl32 , f_img_Rot.g_YROT_sfl32 , f_img_Rot.g_ZROT_sfl32 );
glColor4f( 250, 235, 215 , 1.0f );
glEnable(GL_BLEND);
glEnable(GL_TEXTURE_2D);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBindTexture(GL_TEXTURE_2D, f_Img_ID );
glBegin(GL_QUADS);
glTexCoord2d(0.0,0.0);
glVertex3f( -f_Img_Dim.g_Img_Width_sfl32/2 , -f_Img_Dim.g_Img_Height_sfl32/2, 0.0f);
glTexCoord2d(0.0,1.0);
glVertex3f( -f_Img_Dim.g_Img_Width_sfl32/2 , +f_Img_Dim.g_Img_Height_sfl32/2 , 0.0f);
glTexCoord2d(1.0,1.0);
glVertex3f( +f_Img_Dim.g_Img_Width_sfl32/2 , +f_Img_Dim.g_Img_Height_sfl32/2 , 0.0f);
glTexCoord2d(1.0,0.0);
glVertex3f( +f_Img_Dim.g_Img_Width_sfl32/2 , -f_Img_Dim.g_Img_Height_sfl32/2 , 0.0f);
glEnd();
glFlush( );
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
}