Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: So Jul 06, 2025 04:58

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
BeitragVerfasst: So Apr 08, 2007 21:15 
Offline
DGL Member

Registriert: So Apr 08, 2007 19:47
Beiträge: 3
Frohe Ostern allerseits,

zur Zeit versuche ich mich an einem rudimentären Malprogramm ("paint"-clone) mit OpenGL.
Es sollen per Tastendruck derade Linien gezeichnet werden können

Das Linien-Zeichnen funktioniert wie in MS-Paintbrush.

1. Mausklick um Startpunkt festzulegen.

2. mit weiterhin gedrückter Maustaste einen zweiten Punkt anvisieren:
Es wird dabei immer eine Gerade zwischen dem Startpunkt und dem aktuell markierten Punkt angezeigt. Ich handhabe es so, dass jedesmal wenn eine neue (vorläufige) Linie gezeichnet wird, die vorherige nocheinmal mit der Hintergrundfarbe des Fensters überzeichnet wird. So ist immer nur noch die aktuelle Linie sichtbar.

3. Maustaste loslassen.

4. Linie wird zwischen den beiden Punkten wird endgültig gezeichnet.

Das funktioniert soweit auch.

Das große Problem an der Sache ist aber folgendes:

Leider werden natürlich beim Überzeichen der vorläufigen Geraden auch vorher schon "entgültig" gezeichnete Linien mit der Hintergrundfarbe überpinselt.

Bisher habe ich es so gelöst, dass ich die endgültigen Linien in einem array (struct linie; linie fertigeLinien[] ) ablege und jedesmal wenn eine vorläufige Linie überschrieben wird wieder alle endgültigen Linien aus dem array auslese und neu zeichnen lasse.
Das erweist sich allerdings alles andere als performant. Sobald sich mehr als 10, 15 endgültige Linien auf dem Bildscirm befinden, dauert es merklich, bis eine vorläufige Linie als Reaktion auf das Bewegen der Maus mit gedrückter Taste erscheint.

Meine Frage ist deshalb:

Gibt es eine Möglichkeit (Funktion), den gesamten Fensterinhalt irgendwie festzuhalten und später wieder aufzurufen? Dann könnte ich, wenn eine vorläufige Linie überschrieben wird, diese Funktion ausführen und müsste nicht müselig jede Linie einzeln noch einmal aufrufen und berechnen lassen.

Österliche Grüße,

Günni


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 09, 2007 10:26 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Stichwort: Pixelbufferobjects oder RenderToTexture. Schau dich dazu am besten mal im Forum oder Wiki um.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 09, 2007 10:51 
Offline
DGL Member

Registriert: So Apr 08, 2007 19:47
Beiträge: 3
Hi Lord Horazont,

vielen Dank für den Hinweis, das ( http://wiki.delphigl.com/index.php/Screenshot ) sieht so aus, als ob es mir weiterhelfen kann.
Als blutiger Open GL-Anfänger habe ich nicht gewusst, wonach suchen.

Gruß günni


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 09, 2007 11:40 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hallo Günther,
Du bist schon der zweite, der innerhalb kurzer Zeit nach Linien fragt und Performanceprobleme hat. Ich habe schnell ein Mini-Delphi-Programm zusammengeschustert, das auf Knopfdruck (auf den Start-Button drücken) eine neue gerade farbige Linie per Random erzeugt und in eine Liste speichert. Diese Liste (dh. alle bisher erzeugten Linien) wird danach mit OpenGL ausgegeben; bei jedem Knopfdruck kommt eine Linie dazu. Die Anzahl der angezeigten Linien ist im Fensterbalken zu sehen. Die Ausgabe ist nicht langsam.

Ich hoffe Du programmierst mit Delphi.
Traude


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 09, 2007 17:23 
Offline
DGL Member

Registriert: So Apr 08, 2007 19:47
Beiträge: 3
Hallo Traude,

wenn ich einfach Linien "auf einen Schlag" auf den Screen zeichnen lasse, habe ich mit der array-Lösung auch kein Geschwindigkeitsproblem.

Das Problem kam erst dadurch zustande, dass ich bei jeder Bewegung mit der Maus (Stichwort glutMotionFunc) immer wieder alle Geraden aus dem array auslesen und wieder zeichnen lassen musste, bis die Maus wieder losgelassen wird. Wenn das array zu voll war (10, 15 Einträge haben gereicht), ist das Programm wirklich seeeehr langsam geworden (wie schon beschrieben).

Nun habe ich es so gelöst, dass der komplette Screen gespeichert und wieder ausgelesen wird (glReadPixels, bzw. glDrawPixels) - das geht wunderbar!

Trotzdem vielen Dank für das Beispielprogramm!

gruß günni


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 09, 2007 18:44 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Finde ich gut, dass Du eine Lösung gefunden hast.

Auf die Gefahr hin, dass Du meinst, dass ich das letzte Wort behalten muss: ich habe das Mini-Beispielprogramm so abgeändert, dass Du jetzt zusätzliche Linien mit der Maus ziehen kannst (MouseDown->Mausziehen->MouseUp). Im OnCreate erstelle ich vorher 100 Linien. Ich wollte 1000 erstellen, aber dann kann man die neue Linie nicht mehr erkennen. Es ist aber auch bei 1000 Linien kein Performance-Einbruch feststellbar (und ich habe eine miese Grafikkarte).

Was ich damit sagen will: das einfache Linien ziehen mit glVertex2f genügt.
Traude :wink:


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 22 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 14 Queries | GZIP : On ]