zwei fragen eines grafikprogrammier-anfängers
-
hallo
vorab: ich habe kaum erfahrung mit grafikprogrammierung.
ich habe ein kleines progrämmchen geschrieben welches eine n-body-simulation durchführt. das ganze sieht aktuell so aus:
http://img4host.net/upload/241411045291fae87d25b.PNGvisualisieren tu ich das ganze mit sfml und indem ich die positionsdaten in ein sf::vertexarray kopiere. das klappt alles schon ganz gut.
es gibt nur eine klitze kleine kleinigkeit die mir nicht ganz passt. da für die physik-berechnung natürlich die zeit gemessen wird (ich nehme dafür sf::clock), sind die ergebnisse sehr unnatürlich wenn man das fenster verschiebt. aus irgend einem grund wird dann mein prozess pausiert bis das fenster wieder losgelassen wird. das schlussfolgert dementsprechend hohe gemessene zeiten. dann machen die partikel einfach riesen sätze und alles fliegt irgendwie durch die gegend.
kann man irgendwie den prozess weiter laufen lassen während das fenster verschoben wird? wenn nein, wie kann man ein verschieben erkennen (bei sf::event habe ich nichts derartiges gefunden)?ich habe mir gedacht es könnte aussagekräftiger sein wenn man nicht die partikel anzeigt sondern so eine art heatmap:
http://us.123rf.com/400wm/400/400/claudiodivizia/claudiodivizia0811/claudiodivizia081100010/3792730-colored-heat-map-for-temperature.jpg
meine gedanken zur umsetzung dessen sind, dass für jedes partikel in einem zusätzlichen buffer eine kreisförmige fläche um das partikel gaussverteilt markiert wird (bei überlappen halt einfach addieren).
sollte / kann man das im fragment buffer lösen? kann man da überhaupt neue buffer definieren etc?gruss
-
1. Wegen dem Verschieben: Es gibt keine einfache Möglichkeit. Genaueres findest du hier.
Deine Physik sollte aber ohnehin nicht von der Framerate abhängen, um deterministische Ergebnisse zu erzielen. Wenn du eine fixe Delta-Time hast, wird die Simulation während des Verschiebens einfach pausiert. Falls du aus irgendeinem Grund eine variable Delta-Time brauchst, setze eine obere Grenze.
2. Meinst du Fragment-Shader? Ja, du kannst mittels
sf::Shader
deine eigenen Shader laden. Dazu musst du allerdings GLSL können (eine C-ähnliche Proogrammiersprache). Ist nicht besonders schwierig zu lernen, aber braucht eben Einarbeitungszeit.Geht es dir für die Heatmap nur um die grafische Darstellung, oder speicherst du die Verteilung sowieso noch in einem Array im RAM ab?
-
danke für deine antwort.
1. ich habe mich nun auf ein festes Δt geeinigt, damit ist das problem auch gerade weg.
2. nein, es geht mir nur um die grafische darstellung. hmm, glsl zu lernen für ein ansich so simples problem... dann lasse ich es.
-
asfsfasf schrieb:
2. nein, es geht mir nur um die grafische darstellung. hmm, glsl zu lernen für ein ansich so simples problem... dann lasse ich es.
Du kannst es natürlich auch auf der CPU rechnen, kann aber teuer werden. Mit
sf::Image
kannst du direkt Farben im RAM ansprechen und dann vonsf::Texture
auf die Grafikkarte laden lassen.Vielleicht gibts speziell optimierte Algorithmen zur Heatmap-Berechnung, schau dich dazu vielleicht mal um. Ansonsten würde ich versuchen, nicht in jedem Frame sämtliche Partikel neu zu berechnen, sondern z.B. nur Änderungen. Kommt halt auf dein Problem an; wenn sich ständig alles ändert, bist du damit auch nicht schneller.
-