Seite 1 von 1
QGLWidget: mehrere Bilder in einer Textur speichern
Verfasst: 13. Juli 2009 11:30
von shapoc
Hallo zusammen,
ich habe ca. 1000 Elemente(Quads) mit jeweils einer eigenen Textur/QPixmap) die ich in meiner Szene darstelle.
Bisher erstelle ich für jedes Item eine eigene Textur und packe sie in ein Array von Texturobjekten:
Code: Alles auswählen
glGenTextures(itemList.size(), texNames);
...
void GLWidget::bindTextures()
{
unsigned short int counter = 0;
QList<Item*>::const_iterator i;
for (i = itemList.constBegin(); i != itemList.constEnd(); ++i)
{
QPixmap* pixmap = (*i)->getTexture();
texNames[counter] = bindTexture(*(pixmap), GL_TEXTURE_2D);
++counter;
}
}
Wie bekomme ich es hin, dass ich z.b. mehrere Grafiken in eine Textur packe? Im Moment benutze ich ja den Aufruf der bindTexture Methode, die mir genau aus meiner pixmap eine Textur erzeugt und ins Array packt.
Würde mich freuen, wenn ihr mir Hinweise und Tipps dazu geben könntet?
Verfasst: 13. Juli 2009 13:15
von CaptnChaos
Du kannst die Texturen in ein großes PNG laden und per glTexCoord2f(x, y) auf deine Quads laden. guck dir dazu die referenz von glTexCoord* an.
Sollte 1 der fall sein mach es folgendermaßen:
Code: Alles auswählen
void loadTexture(QString filename, GLuint textureid)
{
QImage img, tmp;
tmp.load(filename); //Bild laden
img = QGLWidget::convertToGLFormat( tmp ); //QImage in opengl format wandeln (umdrehen und farben tauschen)
glGenTextures(1, &textureid);
glBindTexture(GL_TEXTURE_2D, textureid);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, img.width(),
img.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE,
img.bits());
glBindTexture(GL_TEXTURE_2D, 0);
}
void Widget::initializeGL()
{
loadTexture("texture.png", texName);
/*
..... CODE.....
*/
}
void Widget::paintGL()
{
double x = 0, y = 0;
for(int i = 0; i < 1000; i++){
glBegin(GL_QUADS);
glTexCoord(x == 0 : 0.0 ? x/32.0, y == 0 : 0.0 ? y/32.0); glVertex(posx,posy);
glTexCoord((x+1)/32.0, y == 0 : 0.0 ? y/32.0); glVertex(posx,posy);
glTexCoord(x == 0 : 0.0 ? x/32.0, (y+1)/32.0); glVertex(posx,posy);
glTexCoord((x+1)/32.0, y == (y+1)/32.0); glVertex(posx,posy);
glEnd();
x++;
if(x == 32){
x = 0;
y = 0;
}
}
}
oder so in der art. habs mal aufgeschrieben ohne zu testen.
Verfasst: 13. Juli 2009 14:56
von shapoc
@KernelPanic: Danke für den Tipp + Codeausschnitt!!!
Ich bezweifle aber grad, ob das so gut wäre, das alles in nur eine Textur zu packen?! (Oder war das nur beispielhaft) Da ich ja ca. 1000 Texturen mit jeweils 128x128 Pixeln habe, würde das png dann ganz schön groß werden? Bekommt man das überhaupt in eine Textur geladen?
Verfasst: 13. Juli 2009 15:04
von CaptnChaos
Ja bekommt man. aber das stimmt schon, dass das recht groß ist.
Dann musst du das evtl aufteilen.
Nur mal rein interessehalber, wofür braucht man 1000 verschiedene texturen?
Verfasst: 13. Juli 2009 15:10
von shapoc
Was ich machen will:
Ich möchte Bilder eines Ordners anzeigen, und zwar in 3D. Dazu gehe ich die Bilder durch und erstelle mir für jedes ein QPixmap, welches ich dann als Textur für ein Quad erstelle.
Das Auswählen eines Ordners macht der Benutzer, das kann sich also ändern.
die Darstellung soll erstmal in einer Anordnung der Quads in einer Ebene, später dann im Raum realisiert werden, möglichst unter Graka-Beschleunigung.
Verfasst: 13. Juli 2009 15:15
von CaptnChaos
naja dann fällt mir nur dynamisches laden und löschen der texturen ein. also nur das laden was auch angezeigt wird. den rest mit ner standardfarbe oder textur belegen (das was weit weg ist).
Verfasst: 13. Juli 2009 15:22
von shapoc
Ich hätte vielleicht eher noch an mipmapping gedacht, da ich das rauszommen nur soweit realisieren möchte, dass maximal bis zum äußeren Item gezoomt wird und nicht weiter, also maximal alle sichtbar sind. Dabei sollte man aber schon noch die Bilder erkennen (was im Moment so ist).
Trotzdem danke für deine Hilfe.