c++ - OpenGl 纹理猛拉

标签 c++ qt opengl

我使用继承自 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/

相关文章:

c++ - 如何为指令重新排序编写可观察的示例?

qt - 包裹在 QScrollArea 中的小部件没有用完可用大小

python - 如何使用 pyglet 提高批处理的性能?

java - 如何修复 GLSL 1.5 版和 ES 3.0 版之间的兼容性问题

c++ - 如何连接通过 cython 返回对象引用的 C++ 函数

c++ - 将 UINT16 值转换为 UINT8 数组[2]

python - 从 C++ 执行 .py 文件

qt - 具有QT的Opencv窗口中的鼠标指针样式

javascript - 从 JavaScript 调用 Qt 槽

OpenGL 2D 形状问题