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?
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.
quelle