0
QGraphicsItemから継承したクラスを使用します。 OpenGLの助けを借りて別のものを描く機能を持っています。現在、私はテクスチャをロードし、フレームの変更ごとにそれを再描画したいと思います。テクスチャはきれいに表示され、表示されますが、アプリケーションの開始時にこのテクスチャは醜いです。どこに問題があるのか分からない。なぜなら、私はOpenGLの初心者だからだ。ここに私が達成したいことを示すコードがあります:OpenGlテクスチャヤンク
void GLGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem * /* option */, QWidget * widget)
{
painter->beginNativePainting();
static GLuint icoId;
static int icoW;
static int icoH;
static bool first = true;
if (first) {
QImage t;
QImage b;
glEnable(GL_TEXTURE_2D);
glAlphaFunc(GL_GREATER, 0.1f);
glEnable(GL_ALPHA_TEST);
b.load(":/res/example.png", "PNG");
QImage fixedImage(b.width(), b.height(), QImage::Format_ARGB32);
QPainter painter(&fixedImage);
painter.setCompositionMode(QPainter::CompositionMode_Source);
painter.fillRect(fixedImage.rect(), Qt::transparent);
painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
painter.drawImage(0, 0, b);
painter.end();
t = QGLWidget::convertToGLFormat(fixedImage);
glGenTextures(1, &icoId);
glBindTexture(GL_TEXTURE_2D, icoId);
icoW = t.height();
icoH = t.width();
glTexImage2D(GL_TEXTURE_2D, 0, 4, t.width(), t.height(), 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);
}
glViewport(100, 100, icoW, icoH);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glBindTexture(GL_TEXTURE_2D, icoId);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex2f(-1.0f, -1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex2f(1.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex2f(1.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex2f(-1.0f, 1.0f);
glEnd();
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
painter->endNativePainting();
}