AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia OpenGL trotz DoubleBuffer direkt...

OpenGL trotz DoubleBuffer direkt...

Ein Thema von BigAl · begonnen am 15. Nov 2014 · letzter Beitrag vom 16. Nov 2014
Antwort Antwort
Seite 1 von 2  1 2   
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
503 Beiträge
 
Delphi 12 Athens
 
#1

OpenGL trotz DoubleBuffer direkt...

  Alt 15. Nov 2014, 01:08
Hallo zusammen,

ich weiß nicht wie es anders ausdrücken soll, daher der verwirrende Titel.

Also: Ich habe hier ein Objekt geschrieben, welches mir via OpenGL Grafik ausgibt. Ich nutze dazu die dglOpenGL-Unit. Bei dem Programm handelt es sich um eine Art CAD-System, welches 3D-Grafiken darstellt. Wenn ich nun mit der Maus über die Grafik fahre, dann möchte ich die Objekte in der Nähe des Mauszeigers markieren, wenn der Mauszeiger sich wieder entfernt die Markierung wieder entfernen. Das Funktioniert alles sehr gut, allerdings zeichne ich Momentan immer alles neu. Das ist bei mehreren hunderttausend Linien recht aufwändig. Auch möchte ich z.B. einen temporären Markierungsrahmen mit der Maus zeichnen können. Wenn ich nun an den Standard-Canvas von Delphi zurückdenke, dann habe ich solche Sachen eigentlich immer mit XOR gemacht (erstes Zeichnen darstellen, zweites Zeichnen wieder löschen). Dazu müsste ich aber direkt den Ausgabepuffer beschreiben. Normalerweise rendere ich ja in den Hintergrundpuffer und tausche dann mit "SwapBuffers" den Anzeige- und den Hintergrundpuffer aus. Mir fehlt da Momentan noch ein guter Ansatz wie man das Ganze in OpenGL lösen könnte. Am liebsten hätte ich gerne ein ähnliches Verhalten wie z.B. in Sketchup. Mit klicken ein Teil markieren. Mit der Maus einen Rahmen ziehen und mehrere Teile markieren usw...

Hat irgendwer eine Idee? Ich nehme auch gerne irgendwelche Hinweise auf Litertur etc. entgegen. Leider sind 99.9% der OpenGL-Beschreibungen auf Spieleprogrammierung und deren Eigenheiten ausgelegt.

Für alle Tipps schon mal Danke!

Alex
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#2

AW: OpenGL trotz DoubleBuffer direkt...

  Alt 15. Nov 2014, 15:53
Das erste was mir einfallen würde, wäre die statischen Inhalte in eine Textur zu rendern und dann die dynamischen Inhalte darüber zu legen.

Du solltest vorher gucken, ob du überhaupt modernes OpenGL benutzt
Wenn du momentan bei jedem Frame deine 100k Linien neu auf die Grafikkarte schiebst, kannst vermutlich noch eine Menge Performance herausholen ... ohne irgendwelche kruden Workarounds.
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#3

AW: OpenGL trotz DoubleBuffer direkt...

  Alt 15. Nov 2014, 16:08
Also ich mache das so. Da ich noch zusätzlich DDP benutze, rendere ich so 20x pro Durchgang und das funktioniert ganz gut.
Rechnest Du die Positionen der Linien vielleicht jedesmal noch mit aus bei einem Renderdurchgang?
Benutzt Du VBOs?

Wie selektierst Du?
Achtung: Bin kein Informatiker sondern komme vom Bau.

Geändert von Jens01 (15. Nov 2014 um 16:13 Uhr)
  Mit Zitat antworten Zitat
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
503 Beiträge
 
Delphi 12 Athens
 
#4

AW: OpenGL trotz DoubleBuffer direkt...

  Alt 15. Nov 2014, 17:39
Estmal vielen Dank für Eure Antworten. Da tun sich ja gleich noch ein paar Fragen auf :

1. @BUG: Was verstehst Du unter "modernem OpenGL"? Ja, momentan schiebe ich alle Linien bei jedem Rendervorgang auf die Grafikkarte.
2. @Jens01: Was meinst Du mit VBOs? Vertex-Arrays die auf der Grafikkarte gespeichert sind und dann abgerufen werden?
3. @Jens01: DDP?

Die selektierten Objekte rechne ich mir anhand meines Modells aus. Ich habe ja sämtliche Anfangs- und Endpunkte meiner Linien. Jeden Anfangs- und Endpunkt rechne ich dann mit gluProject in Bildschirmkoordinaten um. Dann berechne ich den Abstand meines Mauszeigers zur Linie. Meine Funktion hat als Parameter "MaxDistance" in Pixel. Aus allen Linien nehme ich dann die, die innerhalb der Distanz ist und der Maus am nächsten ist. Ist recht aufwändig. Habe da aber leider noch keine andere Idee. Mir fehlt halt auch noch etwas das Gefühl für die umfangreichen Datenmengen. Die Alternative wäre gluUnproject. Allerdings bin ich noch nicht ganz dahintergestiegen wie ich da mit den Z-Koordinaten verfahren soll...

Alex
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#5

AW: OpenGL trotz DoubleBuffer direkt...

  Alt 15. Nov 2014, 17:55
Zitat:
Die selektierten Objekte rechne ich mir anhand meines Modells aus. ...
Aah, OpenGL hat einen eigenen Selektionsmodus. Dieser ist wohl für die Zukunft nicht mehr unterstützt und soll angeblich auch langsam sein, aber bei mir funktioniert der noch ganz gut.
Das andere ist dies Colorpicking, da gibt man jedem Objekt eine eindeutige Farbe und rendert so einmal blind durch und kann dann anhand der Pixelfarbe am Selektionspunkt auf das Objekt zurückschließen. Colorpicking geht wohl mit Shader und ohne.
Tutorials :
-Tutorial Selection
-Tutorial Objektselektion
-Tutorial ColorPicking Shader

P.S.: DDP ist eine Art, transparente Objekte darzustellen.
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#6

AW: OpenGL trotz DoubleBuffer direkt...

  Alt 15. Nov 2014, 18:14
1. @BUG: Was verstehst Du unter "modernem OpenGL"? Ja, momentan schiebe ich alle Linien bei jedem Rendervorgang auf die Grafikkarte.
Es gibt einige Funktionen, die veraltet sind und aus Performance-Gründen nicht mehr benutzt werden sollten ... z.B. glBegin/glEnd. Hier und hier findest du einiges an Material.
  Mit Zitat antworten Zitat
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
503 Beiträge
 
Delphi 12 Athens
 
#7

AW: OpenGL trotz DoubleBuffer direkt...

  Alt 15. Nov 2014, 18:20
Hallo Jens01,

das mit den Tutorials habe ich mir angesehen. Da tun sich aber einige Probleme auf. Zum einen reden wir von > 100k Objekten. Die Objekte sind nur Linien. Ich will also schon selektieren, wenn ich schon in der Nähe des Objekts bin. Und lösen tut das mein ursprüngliches Problem auch irgendwie nicht: Wie zeichne ich temporäre Dinge, die ich dann ein und wieder ausblenden kann, ohne dass ich alles neu zeichnen muss...

Am ehesten - für die Selektion - würde wohl noch das mit glLoadName gehen. Da muss halt dann für jede Linie eine ID (Cardinal) abgelegt werden...

Gruß
Alex
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#8

AW: OpenGL trotz DoubleBuffer direkt...

  Alt 15. Nov 2014, 18:54
Also das mit den 100k Linien kann ich Dir leider auch nicht lösen. Reduzieren kann man das vielleicht, dass man Linien, die nicht sichbar sind, ausläßt. Mit den VBOs (Vertex-Arrays ua.) könnte eine Lösung sein, da bin ich aber leider nicht so drin.
Das mit der Näherung löst man -soweit ich das weiss- mit unsichtbaren Objekten um die Linie herum.
Also bei einem zu selektierenden Punkt nimmt man eine unsichtbare Kugel, wobei der Punkt der Mittelpunkt der Kugel ist. Wenn jetzt die Kugel selektiert wird, dann.. eben der Punkt.

Ich glaub, dass ist so ähnlich wie bei den Kollision-Tutorials:
Tutorial Kollision 1-3
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#9

AW: OpenGL trotz DoubleBuffer direkt...

  Alt 15. Nov 2014, 19:03
Moment, bei dem Selektionmodus kann man auch die Größe des selektieren Bereichs angeben. Mußt man genau gucken, ob dir sowas helfen kann.
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
503 Beiträge
 
Delphi 12 Athens
 
#10

AW: OpenGL trotz DoubleBuffer direkt...

  Alt 15. Nov 2014, 19:34
Hallo Jens,

langsam wird's interessant. Ich habe gerade nochmal in den Tutorials rumgeschnüffelt. Wo meinst Du kann man im Selektionsmodus den Bereich angeben?

Alex
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:50 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz