QT/OpenGL: Textur Problem

Alles rund um die Programmierung mit Qt
Antworten
AndiLatte
Beiträge: 104
Registriert: 13. November 2007 13:39

QT/OpenGL: Textur Problem

Beitrag von AndiLatte »

dies hier funktioniert prima. Ich rufe ein Pixel-array auf und speicher es via QImage und QPixmap als png und rufe es als Textur auf.

Code: Alles auswählen

   
buf.load( "temp.png" )

tex= QGLWidget::convertToGLFormat( buffer ); 

glTexImage2D( GL_TEXTURE_2D, 0, 3, tex.width(), tex.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tex.bits() );
dies hier stürzt ab: Ich übergebe das Pixelarray via QImage

Code: Alles auswählen

	QImage myImage(width ,height,QImage::Format_ARGB32);
	for(int i = 0; i < width; i++){
		for(int j = 0; j < height; j++)
		{
			uint convVal = ((uint) image->data[(j*width + i)*2]);
			value = qRgb(convVal, convVal, convVal);
			myImage.setPixel(i,j,value);
		}
	}
[code] tex = QGLWidget::convertToGLFormat(myImage);
glTexImage2D( GL_TEXTURE_2D, 0, 3, tex.width(), tex.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tex.bits() );[/code]

es zerlegt das programm mit einem segfault bei

Code: Alles auswählen

 tex = QGLWidget::convertToGLFormat(myImage);
OpenGL mag also scheinbar nicht das Format? Oder irre ich? Wie löse ich das Problem
quarks
Beiträge: 2
Registriert: 4. März 2008 11:05

Beitrag von quarks »

wenn

Code: Alles auswählen

tex = QGLWidget::convertToGLFormat(myImage);
Probleme macht, dann lass es doch einfach mal weg. :D
In wirklichkeit mach convertToGLFormat nur folgendes: (verkürzt)

Code: Alles auswählen

    QImage res = img.convertToFormat(QImage::Format_ARGB32);
    res = res.mirrored();
    // Qt has ARGB; OpenGL wants ABGR (i.e. RGBA backwards)
    res = res.rgbSwapped();
ins ARGB32 konvertieren kannst sparen, myImage ist das ja schon, würde aber vermutlich durch ne abfrage sowieso nicht ausgeführt,
Anstatt rgbSwapped geht bei glTexImage2D wenn man GL_BGRA statt GL_RGBA nimmt. Somit wäre dann ohne die Zeile die Textur test weise nur gespiegelt.

Insgesamt ist das ganze nicht so der Brüller - erst ein QImage erstellen, jedes Pixel setzen, dann spiegeln und die Farbkomponente tauschen. Da kannst in der Schleife auch gleich das Array selbst passend machen, oder ist es gar in deinem vermutlich eigenen image schon fast passend? Über QImage ist es auf jeden Fall nicht gerade performant.

Zum eigentlichen SegFault, ich glaub der Grund dafür liegt irgend wo anders. Oft ist der Grund für einen SegFault wenn man schon zuvor was im Speicher verhunzt, der Code aber erst späterer deshalb auf die Nase fällt.
Antworten