2009-05-08 19 views
2

Ich bin eine 3D-Anwendung mit DirectX 10 und ich frage mich, wie das Tackling des Shadermanagements ist.Direct3D 10 und Shader Management

Ist es am effektivsten, alle Shader, die beim Start der Anwendung vorhanden sind, vorab zu laden und sie dann nach Bedarf zu verwenden, oder trainiert dies die Ressourcen der Hardware, wenn die Anzahl höher wird.

Auch ich frage mich, ob es eine Geschwindigkeitsüberlegung ist, das Rendering durch Shader zu ordnen, damit die Shader-Schalter minimiert werden.

Antwort

2

Ich habe nicht mit DX10, nur DX9 gearbeitet, aber ich denke, diese Dinge sind immer noch die gleichen.

Abhängig von Ihrer Anwendung können Sie tatsächlich Shader zur Laufzeit generieren (viele aktuelle anspruchsvolle 3D-Spiele tun dies).

Das Vorladen der Shader ist keine schlechte Idee, abhängig davon, ob Sie Shader generieren, wie viele es sind, was Ihre Speicherüberlegungen sind - es kommt darauf an. Das Laden eines Shaders (mit dem ich annehme, dass Sie die ID3DXEffect-Instanz erstellen) erfordert jedoch nur zur Laufzeit Speicher und keine CPU-Auslastung.

Bestellung durch Shader ist eine gute Idee. Im Allgemeinen ist die Sortierung nach Material eine gute Idee, da das Wechseln von Shadern einen gewissen Overhead verursacht (nicht übermäßig, aber wahrnehmbar, abhängig von der Komplexität Ihrer App).

Für Ihre drawcalls Sortierung, lesen Sie: http://realtimecollisiondetection.net/blog/?p=86

1

In D3D10 alle Geräteressourcen virtualisiert werden, so dass Sie nicht aus ihnen ausgeführt wird. Natürlich können Sie immer noch die physischen Ressourcen auf der Karte ausschöpfen und viel Prügel verursachen, wenn Sie nicht aufpassen, was Sie tun.

Darüber hinaus haben sie den Gerätestatus erheblich geändert, um die Kosten für den Schaltzustand, einschließlich Shadern, zu reduzieren.

Aber was Sie wirklich fragen ist "ist Methode X schneller als Methode Y für meine Anwendung?" und obwohl D3D10 die Zustandsverwaltung vereinfacht, um den Schaltzustand schneller zu machen, ist die einzige Möglichkeit, die obige Frage zu beantworten, eine Leistungsmessung mit Ihre Anwendung und Ihre Daten.

Der Blogeintrag von realtimecollectiondetection.net spricht nur darüber, wie Sie Ihre Zeichenaufrufe sortieren. Dies wird zu weniger Zustandsumschaltungen führen. Es spielt keine Rolle, wie schnell die Zustandsumschaltung ist, weniger davon ist immer schneller. Das ist ein guter allgemeiner Rat.