我使用继承自 QGraphicsItem 的类。它具有我在 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();
}
最佳答案
对不起,打扰了,但我找到了一个理由。我只是需要
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
开始画之前。我讨厌自己有这样的时刻。我不会删除这个问题,因为我希望这会对某些人有所帮助。
关于c++ - OpenGl 纹理猛拉,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41631780/