Hohe Frame rate

Alles rund um die Programmierung mit Qt
Treehouse
Beiträge: 100
Registriert: 18. Juni 2007 10:21

Beitrag von Treehouse »

Ich rufe diese Funktion auf in der paintGL Funktion diese ist ja bei einem QGLWidget äquivalent zu der Funktion paintEvent wenn ich das richtig verstanden habe. Und immer wenn eine neues Bild vorliegt rufe ich updateGL auf.
Treehouse
Beiträge: 100
Registriert: 18. Juni 2007 10:21

Beitrag von Treehouse »

Kennt sich jemand vielleicht damit aus wie man ein 8bit Grauwert Bild in einem QGLWidget darstellt. Meine suche nach einem Beispielcode ist leider nicht so erfolgreich.
Treehouse
Beiträge: 100
Registriert: 18. Juni 2007 10:21

Beitrag von Treehouse »

Ich bekomme es einfach nicht hin. Habe jetzt mal ein Bild in ein QImage geladen was ich auf der Platte habe und wollte dieses in einem QGLWidget darstellen.

Aber alles was ich sehe ist ein schwarzes Widget. Aber eigentlich sollte es so gehen, laut den Anleitungen die ich gefunden habe.

Code: Alles auswählen

glData.load("C:\\HHH.bmp");
	QImage tex1 = QGLWidget::convertToGLFormat(glData);
	
//	glDrawPixels( tex1.width(),  tex1.height(),  GL_LUMINANCE, GL_UNSIGNED_BYTE,  tex1.bits());

Gruß

Treehouse
Treehouse
Beiträge: 100
Registriert: 18. Juni 2007 10:21

Beitrag von Treehouse »

Treehouse hat geschrieben:Ich bekomme es einfach nicht hin. Habe jetzt mal ein Bild in ein QImage geladen was ich auf der Platte habe und wollte dieses in einem QGLWidget darstellen.

Aber alles was ich sehe ist ein schwarzes Widget. Aber eigentlich sollte es so gehen, laut den Anleitungen die ich gefunden habe.

Code: Alles auswählen

glData.load("C:\\HHH.bmp");
	QImage tex1 = QGLWidget::convertToGLFormat(glData);
	
glDrawPixels( tex1.width(),  tex1.height(),  GL_LUMINANCE, GL_UNSIGNED_BYTE,  tex1.bits());

Gruß

Treehouse
FaS
Beiträge: 184
Registriert: 25. Mai 2006 19:48
Kontaktdaten:

Beitrag von FaS »

Curtis Newton hat geschrieben:
Treehouse hat geschrieben:Mhh nutzt man das nicht nur bei 3D Darstellungen ?? Ich habe nur 2D Bilder
Hmmm, die Doku sagt:

glDrawPixels reads pixel data from memory and writes it into the frame buffer relative to the current raster position.

Wie ist denn die Rasterposition (glGet mit GL_CURRENT_RASTER_POSITION)?

C.
Treehouse hat geschrieben:Mhh ich weiß jetzt nicht genau wie du das meinst. Ich habe eigentlich nichts weiter an dem Widget verändert ich rufe lediglich diese Funktion auf weil ich dacht so kann ich das aktuelle Bild in dem Widget darstellen.

Sorry ich scheine den Wald vor lauter Bäumen nicht zu sehen :oops:
Bei OpenGL gibt's technisch kein nur-2D. Und laut Doku existiert ein direkter Zusammenhang zwischen der Rasterposition und dem zu rasternden Bild, das erfordert keine weitere Diskussion. Wie er das meint> du musst OpenGL sagen, an welche Stelle das Bild gemalt werden soll. GL_CURRENT_RASTER_POSITION sollte aber initial schon passen, zum testen schadet das aber nicht.
Hast du auch glViewport usw. drin, wie in der Qt-Doku?
Vielleicht stimmt auch was mit dem Koordinatensystem nicht..
Die beste mir bekannte deutsche OpenGL-Dokumentation: http://wiki.delphigl.com/
Treehouse
Beiträge: 100
Registriert: 18. Juni 2007 10:21

Beitrag von Treehouse »

Wie gesagt ich nutze nur die draw funktion wie beschrieben von OpenGL. Weißt du was ich da sonst noch einstellen muss?

Gibt es nicht noch eine Möglichkeit Bilder schnell an zu zeigen so das die Prozessor last nicht in den Himmel schießt.

Oder kennt vielleicht jemand Beispiel Code von OpenGl in dem sowas implementiert ist.
FaS
Beiträge: 184
Registriert: 25. Mai 2006 19:48
Kontaktdaten:

Beitrag von FaS »

In der QGLWidget-Dokumentation steht aber noch etwas mehr, als eine Draw-Funktion (siehe "Here is a rough outline of how a QGLWidget subclass might look:"). Und glRasterPos hast du bestimmt auch noch nicht benutzt. Wie soll man dir helfen, wenn du die Ratschläge nicht befolgst?
Treehouse
Beiträge: 100
Registriert: 18. Juni 2007 10:21

Beitrag von Treehouse »

Das habe ich soweit alles. Aber guck mal meinst du das ist für ein Bild richtig

Code: Alles auswählen

 glBegin(GL_QUADS);
Weil sowas steht nicht in der Doku. Ich denke mal sowas wird nicht gesagt weil OpenGl ja normalerweise für 2D-3D Effekte eingesetzt wird und nicht zur Bildanzeige.
FaS
Beiträge: 184
Registriert: 25. Mai 2006 19:48
Kontaktdaten:

Beitrag von FaS »

In welcher Doku? In der von Qt steht das doch. Aber genau das brauchst du nicht, alles in paintGL() brauchst du nicht bis auf deine zwei funktionen (rasterpos setzen, zeichnen).

glViewport(0, 0, (GLint)w, (GLint)h); innerhalb von resizeGL() sollte aber vermutlich schon rein, bin mir aber nicht sicher wie die rasterzeichenoperationen arbeiten, hab ich noch nicht benutzt.

QGLWidget hab ich aber auch noch nicht benutzt, ka. wie/wann der die bild-puffer swapped (backbuffer wo dein bild gemalt wurde <--> frontbuffer was du siehst)

Google meint, du sollst das mal probieren (in paintGL() rein):

Code: Alles auswählen

  int size = width()*height();

  //Create some nice colours (3 floats per pixel) from data -10..+10
  float* pixels = new float[size*3];
  for(int i=0;i<size;i++) {
    colour(10.0-((i*20.0)/size),&pixels[i*3]);
  } 

  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  glDrawPixels(width(),height(),GL_RGB,GL_FLOAT,pixels);
Und die benötigten Funktionen noch aus http://www.cs.mun.ca/~blangdon/opengl/glDrawPixels.html reinkopieren (ab einschließlich #include "math.h", bis ausschließlich void display()), oder such dir ein anderes Beispiel.

Wenn du was != schwarz siehst, funktioniert das Drumherum und nur die Drawmethode oder die Bilddaten sind fehlerhaft.
Treehouse
Beiträge: 100
Registriert: 18. Juni 2007 10:21

Beitrag von Treehouse »

So bin jetzt relativ weit. Sehe von meinem Bild schon den Oberstenstreifen.
Nur habe ich das Problem, dass das Bild nicht neu gezeichnet wird beim paintGL Aufruf. Wenn ich das Fenster bewege oder die Größe ändere dann wird das Bild aktualisiert.

Hier mal die paintGL Funktion

Code: Alles auswählen

QMutexLocker lock(&m_mutex);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
if ( !newBit ) 
		glDrawPixels(m_image.width(), m_image.height(), GL_RGB, GL_UNSIGNED_BYTE, bits);

glEnd();
Muss man vielleicht noch was ändern damit das Bild neu gezeichnet wird?

Gruß

Treehouse
Curtis Newton
Beiträge: 122
Registriert: 11. Juni 2008 18:39

Beitrag von Curtis Newton »

Treehouse hat geschrieben:So bin jetzt relativ weit. Sehe von meinem Bild schon den Oberstenstreifen.
Nur habe ich das Problem, dass das Bild nicht neu gezeichnet wird beim paintGL Aufruf. [/code]

Muss man vielleicht noch was ändern damit das Bild neu gezeichnet wird?

Gruß

Treehouse
Was ist denn ein paintGL-Aufruf? Schreib doch mal deutlich, was Du machst. Und lies mal die Doku, speziell updateGL. Sage ich mal so.
Treehouse
Beiträge: 100
Registriert: 18. Juni 2007 10:21

Beitrag von Treehouse »

Hallo,

danke für deine Antwort. Sorry es stimmt nartürlich das ich schon sagen sollte das ich bei jedem neu vorliegenden Bild updateGL() aufrufe. Aber letztlich zeichnet nur update() das Fenster neu. Was ich nicht ganz verstehe weil es heißt ja das mal updateGL() aufrufen soll.
Curtis Newton
Beiträge: 122
Registriert: 11. Juni 2008 18:39

Beitrag von Curtis Newton »

Treehouse hat geschrieben:Hallo,

danke für deine Antwort. Sorry es stimmt nartürlich das ich schon sagen sollte das ich bei jedem neu vorliegenden Bild updateGL() aufrufe. Aber letztlich zeichnet nur update() das Fenster neu. Was ich nicht ganz verstehe weil es heißt ja das mal updateGL() aufrufen soll.
Was sagt denn glRasterPos? Vielleicht wird ja bei einem update die Rasterposition zurückgesetzt und bei updateGL nicht. Oder so. Keine Ahnung. Mal geraten.

Wenn nicht, mach doch mal ein einfaches Beispielprojekt, wo Du einfach einen einfachen Farbverlauf oder so anzeigt.

C.
Treehouse
Beiträge: 100
Registriert: 18. Juni 2007 10:21

Beitrag von Treehouse »

So habe jetzt eine Prozessor Last von 6% das ist schon mal mehr als super. Vielen dank schon mal bis hierhin an alle die geholfen haben.

Jetzt habe ich noch ein letztes Problem an das ich nicht Gedacht habe. Das image was ich bekomme, hat eine Auflösung von 1600 x 1200. Jetzt müßte ich falls das Widget zu klein ist dies auf die Größe des Widgets skalieren. Dazu habe ich die Funktion gluScaleImage gefunden. Nur leider ist diese wieder so langsam das ich dann wieder eine Prozessor Last von 66% habe.

Gibt es vielleicht noch eine Möglichkeit das image zu skalieren, so das ich wieder auf eine geringere Prozessor Last komme. Hätte jetzt nicht damit gerechnet, dass diese Funktion soviel Power braucht.
Curtis Newton
Beiträge: 122
Registriert: 11. Juni 2008 18:39

Beitrag von Curtis Newton »

Treehouse hat geschrieben:So habe jetzt eine Prozessor Last von 6% das ist schon mal mehr als super. Vielen dank schon mal bis hierhin an alle die geholfen haben.

Jetzt habe ich noch ein letztes Problem an das ich nicht Gedacht habe. Das image was ich bekomme, hat eine Auflösung von 1600 x 1200. Jetzt müßte ich falls das Widget zu klein ist dies auf die Größe des Widgets skalieren. Dazu habe ich die Funktion gluScaleImage gefunden. Nur leider ist diese wieder so langsam das ich dann wieder eine Prozessor Last von 66% habe.

Gibt es vielleicht noch eine Möglichkeit das image zu skalieren, so das ich wieder auf eine geringere Prozessor Last komme. Hätte jetzt nicht damit gerechnet, dass diese Funktion soviel Power braucht.
Was war denn das Problem? Vielleicht habens auch mal andere und würden gerne die Lösung kennen?

Und ja, es geht schneller, aber erst sagen, was die Lösung war ;-)

C.
Antworten