Anzeige:
Ergebnis 1 bis 8 von 8

Thema: OpenGL + Qt: Textur wird nicht angezeigt, hab ich was vergessen?

  1. #1
    Registrierter Benutzer
    Registriert seit
    08.07.2002
    Beiträge
    719

    OpenGL + Qt: Textur wird nicht angezeigt, hab ich was vergessen?

    Ich hab gestern mal wieder was kleines mit OpenGL versucht zu machen, ich war aber irgendwie nicht mal mehr fähig, eine Textur auf ein Rechteck zu kleben. Ich glaub, ich steh ziemlich auf dem Schlauch.

    Code:
    // g++ -I$QTDIR/include -L$QTDIR/lib -o gltest textest.cpp -lqt-mt
    
    #include <qgl.h>
    #include <qapplication.h>
    #include <qimage.h>
    
    class GLTest : public QGLWidget
    {
     public:
      GLTest(QWidget* parent = 0);
    
     protected:
      void initializeGL();
      void resizeGL(int w, int h);
      void paintGL();
    
      QImage tex;
      GLuint texid[1];
    };
    
    GLTest::GLTest(QWidget* parent) : QGLWidget(parent)
    {
     tex.load(QString("/home/axel/gfx/qt2.png"));
    }
    void GLTest::GLTest::initializeGL()
    {
     glClearColor(0.5f,0.5f,0.5f,1.0f);
     glGenTextures(1, &texid[0]);
     glBindTexture( GL_TEXTURE_2D, texid[0] );
     glTexImage2D(GL_TEXTURE_2D, 0, 4, tex.width(), tex.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tex.bits());
     glEnable(GL_TEXTURE_2D);
    }
    void GLTest::resizeGL(int w, int h)
    {
     glMatrixMode (GL_PROJECTION);
     glLoadIdentity ();
     glOrtho(0, w, h, 0, -1, 1);
     glMatrixMode(GL_MODELVIEW);
     glViewport(0,0,w, h);
    }
    void GLTest::paintGL()
    {
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     glLoadIdentity();
    
     glBindTexture(GL_TEXTURE_2D,texid[0]);
    
     glColor3f(1.0f,1.0f,1.0f);
    
     glBegin(GL_QUADS);
      glTexCoord2f(0.0f,0.0f);
      glVertex2i(0,0);
    
      glTexCoord2f(0.0f,1.0f);
      glVertex2i(0,tex.height());
    
      glTexCoord2f(1.0f,1.0f);
      glVertex2i(tex.width(),tex.height());
    
      glTexCoord2f(1.0f,0.0f);
      glVertex2i(tex.width(),0);
     glEnd();
    }
    int main(int argc, char** argv)
    {
     QApplication app(argc, argv);
     GLTest gltest;
     app.setMainWidget(&gltest);
     gltest.show();
     return app.exec();
    }

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Ich kenn mich mit GL nicht aus, aber ich hab diese Methode in der GLWidget Doku gefunden:
    Code:
    QImage QGLWidget::convertToGLFormat ( const QImage & img )
    Dort gibts auch einen Link auf eine Beispiel Datei.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  3. #3
    Registrierter Benutzer
    Registriert seit
    08.07.2002
    Beiträge
    719
    Die Methode kenne ich, das muss man aber nicht unbedingt haben: Wenn man das nicht macht, sind die Farbkanäle Blau und Rot vertauscht und das Bild steht auf dem Kopf. Ich glaub auch nicht, das der Fehler im Qt-Quelltext liegt. Ich hatte ein anderes Programm, das die Textur dynamisch erzeugt, dieses Programm ist nur ein kleines Testprogramm, wo der Fehler aus der großen App rausgezogen ist.

  4. #4
    Registrierter Benutzer
    Registriert seit
    08.07.2002
    Beiträge
    719
    So, ich habe herausgefunden, woran es liegt. Ich scheine eine komische OpenGL-Implementierung zu haben, jedenfalls muss ich Sachen machen, die nicht im Redbook stehen. Um das Beispiel zum Laufen zu bekommen, muss ich folgendes in den InitCode einfügen:

    Code:
     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    Normalerweise sollte das mit sinnvollen Defaultwerten belegt sein. Laut Redbook sollte man das Spielchen mit glBindTexture auch nur brauchen, wenn man mehr als eine Textur verwendet.

  5. #5
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Gibst eine bestimmte Stelle in initializeGL wo das hin muss?
    Bei mir gehts noch nicht.

    Wie groß darf/muss das Image sein?

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  6. #6
    Registrierter Benutzer
    Registriert seit
    08.07.2002
    Beiträge
    719
    Das ist ansich egal, ich mach es ans Ende. Bei OpenGL-Texturen ist es wichtig, das Breie und Höhe eine Zweierpotenz ist, also etwa 64x64 oder auch 32x64

  7. #7
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Original geschrieben von axeljaeger
    Das ist ansich egal, ich mach es ans Ende. Bei OpenGL-Texturen ist es wichtig, das Breie und Höhe eine Zweierpotenz ist, also etwa 64x64 oder auch 32x64
    Ich musste es nach glBindTexture einfügen, oder noch später, also wie du am Ende.
    Aber das mit den Größen wars ansich.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  8. #8
    LiquidAcid
    Gast
    Original geschrieben von axeljaeger
    So, ich habe herausgefunden, woran es liegt. Ich scheine eine komische OpenGL-Implementierung zu haben, jedenfalls muss ich Sachen machen, die nicht im Redbook stehen. Um das Beispiel zum Laufen zu bekommen, muss ich folgendes in den InitCode einfügen:

    Code:
     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    Normalerweise sollte das mit sinnvollen Defaultwerten belegt sein. Laut Redbook sollte man das Spielchen mit glBindTexture auch nur brauchen, wenn man mehr als eine Textur verwendet.
    Es ist mit auch mit sinnvollen Defaultwerten belegt. Nur sollte man die auch kennen
    Das OGL blue book sagt dazu: "The initial value of GL_TEXTURE_MIN_FILTER is GL_NEAREST_MIPMAP_LINEAR"
    Ich sehe allerdings nicht, dass du irgendwelche Mipmaps für die Textur erstellst. Kein Wunder dass er also nichts anzeigt.

    cya
    liquid

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •