Hohe Frame rate
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.
Gruß
Treehouse
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 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
Curtis Newton hat geschrieben:Hmmm, die Doku sagt:Treehouse hat geschrieben:Mhh nutzt man das nicht nur bei 3D Darstellungen ?? Ich habe nur 2D Bilder
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.
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.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
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/
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.
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.
Das habe ich soweit alles. Aber guck mal meinst du das ist für ein Bild richtig
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.
Code: Alles auswählen
glBegin(GL_QUADS);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):
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.
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);Wenn du was != schwarz siehst, funktioniert das Drumherum und nur die Drawmethode oder die Bilddaten sind fehlerhaft.
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
Muss man vielleicht noch was ändern damit das Bild neu gezeichnet wird?
Gruß
Treehouse
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();Gruß
Treehouse
-
Curtis Newton
- Beiträge: 122
- Registriert: 11. Juni 2008 18:39
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 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
-
Curtis Newton
- Beiträge: 122
- Registriert: 11. Juni 2008 18:39
Was sagt denn glRasterPos? Vielleicht wird ja bei einem update die Rasterposition zurückgesetzt und bei updateGL nicht. Oder so. Keine Ahnung. Mal geraten.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.
Wenn nicht, mach doch mal ein einfaches Beispielprojekt, wo Du einfach einen einfachen Farbverlauf oder so anzeigt.
C.
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.
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
Was war denn das Problem? Vielleicht habens auch mal andere und würden gerne die Lösung kennen?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.
Und ja, es geht schneller, aber erst sagen, was die Lösung war
C.