ich habe da mal wieder ein recht exklusives Problem. Ich habe eine recht komplexe Partikelsimulation mit einer großen Anzahl an Emitter. Ich nutze hierzu Transformfeedback und Geometry-Shader für die Physik. Für eine Zusatzfunktion benötige ich jetzt eine Möglichkeit die aktuell durch partikel maximal erreichte Höhe für jeden Emitters herauszubekommen. Zum Aufbau:
Ich habe zwei Pos, Dir und Info Puffer dimensioniert auf max 2mio Partikel, welche in jedem Frame durch den Geometry-Shader gerechnet werden (einmal lesend und einmal schreibend). Dazu habe ich noch einen weiteren "EmitterInfo" Puffer dimensioniert auf Emitteranzahl, dieser wird lediglich für physikparamter genutzt und als TBO reingeladen. Jedes Partikel "weiß" anhand einer ID genau wo es im EmitterInfo Buffer nach seinen Werten suchen muss. Die ID steht dafür in der w-corrd des Pos-buffers.
Die Physik ist nun rel. komplex hier spielen viele faktoren und zufall eine Rolle, also keine Chance die max-höhe irgendwie anders zu berechnen...
Irgendwie müsste ich in parallel auch wieder in meinen EmutterInfo Buffer schreiben können, so könnte ich pro Partikel einfach einmal testen auf Max-Höhe und ggf. überschreiben falls aktueles Partikel höher ist.. Doch ich denke das ist von der Logik (Multi GPU, gleichzeitges schreiben, etc..) nicht möglich..
Aktuell ist mir hier noch keine Lösung eingefallen, ausser vielleicht alle Partikel nach dem Update zurück zur GPU zu hohlen und dort das höhste Partikel zu suchen.. doch ich denke ~500K Partikel und ~500 Emitter dürfte alles zum kentern bringen.. Ich hab dies aktuell schon probiert, doch mir war es bisher noch nichtmal möglich irgendwie wieder aus dem VBO zu lesen.. kommt nur müll bei raus..
Generell für Partikelsysteme würde ich vielleicht mal auf OpenCL oder auf der neusten Generation auf ComputeShader umsteigen. Damit bist du ein wenig flexibler. Eine Möglichkeit ohne OpenCL wäre noch SSBOs einzusetzen. Da gibt es zb. auch atomische Min und Max Funktionen die das sehr einfach auf der GPU lösen sollten. Einfach die für jeden Emitter einen Float einrichten und dann für jeden Partikel dessen Y-Wert mit dem Maximieren. Wenn du nicht OpenGL 4.2/4.3 zur Verfügung hast, fürchte ich, dass du das nur OpenCL/CUDA effizient auf der GPU hinbekommst.
Mitglieder in diesem Forum: 0 Mitglieder und 2 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.