QGL_Widget / Update ohne alles neu zu zeichnen?

Alles rund um die Programmierung mit Qt
Antworten
curator
Beiträge: 26
Registriert: 15. April 2007 21:34

QGL_Widget / Update ohne alles neu zu zeichnen?

Beitrag von curator »

Hallo Gemeinde,

ich habe es geschafft mit qgl_widget eine Szene darzustellen, in der sehr viele einzelne Gerade sind (Teilweise > 1000).
bb
geschrieben habe ich ich die painGL() in etwa folgendes.

Code: Alles auswählen

float GeometryScale; //Skalierungsfaktor Auflösung -->Szene
QPoint GeometryMiddle; //Mittelpunkt der geometrischen Szene

// Hintergrund weiß
glClearColor(1,1,1,0);
glClear(GL_COLOR_BUFFER_BIT);

// Matrix um Bild einzuzeichnen
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
	
glOrtho(-this->width()/2,this->width()/2,-this->height()/2,this->height()/2,-m_kMax,1);

	
// Matrix um Bild einzuzeichnen
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glScalef(m_Scale,m_Scale,1); //m_Scale wird per Mausraus mit 1.1 dividiert oder multipliziert --> Zoom

glTranslatef(m_qcurrentPosition.x,m_qcurrentPosition.y,0); // kann mehr Maus verschoben werden (Drag & Drop der Geometrischen Szene)

glScalef(1/GeometryScale,1/GeometryScale,1);

glTranslatef(-GeometryMiddle.x,-GeometryMiddle.y,0);

//Ab hier wird einfach gezeichnet, gerade für Gerade etc.
/*
*/
Nun zu meinem Problem. Die eigentliche Geometrische Szene ändert sich nur sehr selten, daher Frage ich mich, ob des nicht möglich ist bei einem Mausrad drehen, bei dem jetzt alles neu gezeichnet wird, nur die "Blickposition zu ändern". So würde das wegbewegen der Kamera das Bild verkleinern, würde ich erwarten, ein entsprechendes Verschieben der Kamera der gewünschten Moveeffekt bringen.

Ziel ist es für für also, die Szene einmal zu zeichnen, Sie mir dann per Mausoperationen nur aus anderen Positionen anzuschauen.

1. Geht das
2. Wenn ja, wohin müsste ich die Aufrufe aus der paintGL() verschieben?

Vielen Dank für alle Tipps, werde leider allein nicht fündig.

Alex
P.S.: Der MouseWheel

Code: Alles auswählen

	if(event->delta()<0.0f)
		m_Scale*=1.1f;
	else
		m_Scale/=1.1f;
	updateGL();
curator
Beiträge: 26
Registriert: 15. April 2007 21:34

Beitrag von curator »

Hat hier keine eine Idee, geht das was ich vorhabe nicht, oder habe ich meine Frage falsch gestellt.

Wäre nett, wenn mir jemand helfen könnte.
Superheftig
Beiträge: 63
Registriert: 6. September 2008 15:20

Beitrag von Superheftig »

Wenn du bei opengl die kamera verschiebst musst du auch die szene neu zeichnen. Da führt nichts dran vorbei!
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Bei OpenGL muß immer alles neu gezeichnet werden.
Man kann aber (einen Teil?) der Daten in Listen abspeichern lassen und diese dann immer wieder wiederholen lassen.
curator
Beiträge: 26
Registriert: 15. April 2007 21:34

Beitrag von curator »

Ok, dann werde ich wohl damit leben müssen, dass es bei höherer Geradenanzanzahl ruckelt.

Vielen Dank für die Info!

Gruß
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Aber noch nicht bei 1000. Da muss schon mehr kommen, oder Du hast einen recht betagten Rechner :-)
curator
Beiträge: 26
Registriert: 15. April 2007 21:34

Beitrag von curator »

Ok, 1000 war eine untertriebene Schätzung.

Geht um ein Strahlverfolgungsverfahren, sind also deutlich deutlich mehr

Ruckeln tuts ab gaaanz leicht ab ca. 30.000 Strahlen.

Mal gespannt was das erst in 3D wird :-)
Superheftig
Beiträge: 63
Registriert: 6. September 2008 15:20

Beitrag von Superheftig »

Dann such mal nach display lists oder vertex buffer objects...dabei werden die daten im ram der grafikkarte gespeichert und du bekommst nen risesigen performance boost im gegensatz zu glBegin() / glEnd().
DisplayLists funktionieren nur in statischen szenen in denen sich die objekte nicht bewewgen
http://nehe.gamedev.net/data/lessons/le ... ?lesson=12
http://www.opengl.org/documentation/spe ... de123.html
Vertex Buffer Objects hingegen funktionieren auch mit sich bewegenden objekten
http://nehe.gamedev.net/data/lessons/le ... ?lesson=45
Antworten