Wann ist es besser, Teilmodellmatrizen in den Vertex-Shader hochzuladen?

8

Beim Rendern meiner Szene und beim Durchlaufen des Szenendiagramms wird ab sofort für jeden Knoten seine Modellmatrix aus der Modellmatrix des übergeordneten Knotens und der Pose des Szenenknotens berechnet. Dies ist recht einfach und reduziert die Anzahl der Matrixmultiplikationen bereits auf eine Multiplikation pro Knoten und Frame.

Alle diese Matrixmultiplikationen müssen jedoch auf der CPU und in jedem Frame durchgeführt werden, um (mehrere aufeinanderfolgende) Bewegungen von Szenenknoten sehr schnell ausführen zu können. Die GPU ist jedoch wahrscheinlich viel besser geeignet, um viele Matrixmultiplikationen durchzuführen. Daher denke ich darüber nach, mehrere Teilmodellmatrizen an den Vertex-Shader zu senden, anstatt alles auf der CPU zu berechnen.

Das Senden jedes einzelnen Teils (also der Pose jedes Knotens) an die GPU ist wahrscheinlich nicht sehr sinnvoll, da in diesem Fall alle Berechnungen für jeden Scheitelpunkt anstelle jedes Knotens durchgeführt werden, was die Leistung tatsächlich verringern würde. Aber vielleicht könnten Szenenknoten mit vielen Kindern oder nur nicht bewegten Kindern (relativ zu ihren Eltern) ein Ort sein, um die Modellmatrix zu teilen und die Multiplikationen auf den Shader zu verschieben.

Wann ist es also besser, Teilmodellmatrizen an den Shader zu senden und die Multiplikation auf die GPU zu verschieben? Oder ist es einfach eine schlechte Idee dazu?

Nero
quelle

Antworten:

9

Das Rechnen mit Uniformen ist ein Shader, der normalerweise keine Leistung bringt, wenn man es auf der CPU macht. Eine CPU ist nicht langsamer als eine GPU, wenn sie Matrixmathematik ausführt. Sie ist nur nicht so strukturiert, dass große Mengen an Mathematik parallel ausgeführt werden. Aber Sie müssen tatsächlich so viel rechnen, um einen Gewinn zu erzielen. Wenn Sie zusätzliche Daten an die GPU senden, damit die GPU zwei Matrizen miteinander multipliziert, erhalten Sie selten etwas.

Angenommen, Sie haben einen Puffer mit Skinning-Matrizen. Es kann von Bedeutung sein, ob Sie sie alle in den Weltraum auf der CPU umwandeln oder einfach eine zusätzliche Modell-zu-Weltraum-Matrix an die GPU übergeben. Aber selbst dann hängt es von Ihrem Verhältnis von Eckpunkten zu Knochen ab.

John Calsbeek
quelle
Ich bin abhängig von der Menge der Berechnungen. GPU ist sehr schnell in Bezug auf mathematische Operationen. Es ist also eine Frage des Versuchs und des Benchmarking.
Michael IV
5

Selten, wenn überhaupt. Sie haben es in Ihrer eigenen Frage zur Hälfte beantwortet: Ein Vertex-Shader wird einmal pro Vertex ausgeführt, ein Fragment-Shader einmal pro Fragment. Wenn Sie nicht etwas tun, das für diesen Scheitelpunkt oder dieses Fragment einzigartig ist, tun Sie jedes Mal, wenn Sie einen Shader aufrufen, buchstäblich genau dasselbe. Das klingt für mich nicht effizienter.

Mokosha
quelle