2017-01-13 3 views
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(); 
} 

答えて

1

すみませんが、私は理由を見つけました。私はちょうど必要です

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

描画を開始する前に。私はそのような瞬間のために自分自身が嫌いです。私はこの質問を削除しません、私は望むので、これは誰かを助けるでしょう。