PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : OpenGL + Qt: Textur wird nicht angezeigt, hab ich was vergessen?



axeljaeger
27-09-2003, 11:04
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.



// 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();
}

anda_skoa
27-09-2003, 12:54
Ich kenn mich mit GL nicht aus, aber ich hab diese Methode in der GLWidget Doku gefunden:


QImage QGLWidget::convertToGLFormat ( const QImage & img )

Dort gibts auch einen Link auf eine Beispiel Datei.

Ciao,
_

axeljaeger
27-09-2003, 14:14
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.

axeljaeger
28-09-2003, 09:36
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:



glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTE R,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTE R,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.

anda_skoa
28-09-2003, 10:39
Gibst eine bestimmte Stelle in initializeGL wo das hin muss?
Bei mir gehts noch nicht.

Wie groß darf/muss das Image sein?

Ciao,
_

axeljaeger
28-09-2003, 15:46
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

anda_skoa
28-09-2003, 18:05
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,
_

LiquidAcid
30-09-2003, 20:42
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:



glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTE R,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTE R,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