QGLWidget: mehrere Bilder in einer Textur speichern

Alles rund um die Programmierung mit Qt
Antworten
shapoc
Beiträge: 33
Registriert: 31. Mai 2009 12:18

QGLWidget: mehrere Bilder in einer Textur speichern

Beitrag 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?
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag 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.
shapoc
Beiträge: 33
Registriert: 31. Mai 2009 12:18

Beitrag 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?
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag 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?
shapoc
Beiträge: 33
Registriert: 31. Mai 2009 12:18

Beitrag 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.
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag 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).
shapoc
Beiträge: 33
Registriert: 31. Mai 2009 12:18

Beitrag 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.
Antworten