之前看到有使用第三方库libpng 解决openGL中使用png图标的文章。今天实现了使用QT+OpengL 实现了png图标的使用,没有使用libpng。
下面是代码,仅供参考:
void QglModel::LoadIcons(char * file,GLuint &texture_ID) {
QImage t;
QImage b;
glEnable(GL_TEXTURE_2D);
glAlphaFunc(GL_GREATER, 0.1f); //enables your application to set the alpha test function.
glEnable(GL_ALPHA_TEST);
b.load(file, "PNG");
QImage fixedImage( b.width(), b.height(), QImage::Format_ARGB32);
QPainter painter(&fixedImage);
painter.setCompositionMode(QPainter::CompositionMode_Source);
painter.fillRect(fixedImage.rect(), Qt::transparent); //use transparent fill image rect
painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
painter.drawImage( 0, 0, b);
painter.end();
t = QGLWidget::convertToGLFormat( fixedImage );
glGenTextures(1, &texture_ID ); //name Textures
glBindTexture( GL_TEXTURE_2D, texture_ID ); //create Textures
//zoomicon_size.setHeight( t.height() );
//zoomicon_size.setWidth( t.width() );
glTexImage2D( GL_TEXTURE_2D, 0, 4, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits());
//glTexImage2D( GL_TEXTURE_2D, 0, 4, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits());
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glDisable(GL_ALPHA_TEST);
glDisable(GL_TEXTURE_2D);
}
void QglModel::DrawIcons(int x,int y,int pixwidth,GLuint &texture_ID)
{
/*if (!zoomicon_loaded){
LoadIcons(file);
zoomicon_loaded = true;
}
*/
//glViewport(x, y, zoomicon_size.width(), zoomicon_size.height());
//glMatrixMode(GL_PROJECTION);
//glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glBindTexture(GL_TEXTURE_2D, texture_ID);
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);
glVertex2f(-pixwidth+x, -pixwidth+y);
glTexCoord2f(1.0f, 0.0f);
glVertex2f(pixwidth+x, -pixwidth+y);
glTexCoord2f(1.0f, 1.0f);
glVertex2f(pixwidth+x,pixwidth+y);
glTexCoord2f(0.0f, 1.0f);
glVertex2f(-pixwidth+x,pixwidth+y);
glEnd();
glDisable(GL_TEXTURE_2D);
}
工程文件代码: