PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Direct 3D, Renderpfade, Shader und Co


Demirug
2003-04-27, 15:20:48
Da es scheinbar immer wieder Missverständnisse bezüglich Renderpfade und Shaderversionen bei Direct 3D kommt hier mal eine kleine Einführung.

DirectX unterstützt seit DX8 zwei verschiedene Modele zur Programmierung.

1. Das Model der konfigurierbaren Vertex und Pixel einheit (DX7).

Hierbei ist es erlaubt aus einer fest vorgegebenen Anzahl von Optionen die gewünschten Auszuwählen und zu konfiguieren.

2. Das Model der programmierbaren Vertex und Pixeleinheit (DX8)

Bei diesem Model werden sämtliche Vertex und Pixel operationen jeweils von einem Programm (shader) gesteuert.

DX9 führte nun kein neues Model ein sondern erweiterte im wesentlichen nur das DX8 Model um weitere Shaderversionen mit zusätzlichen Fähigkeiten.

Aus Programmiersicht gibt es also bei der Direct 3d Programmierung nur zwei Modele zu berücksichtigen DX7 und DX8/9.

Aufgrund der grossen Flexibilität der Shaderprogramme ist es heute nicht mehr möglich alle Grafikeffekte die eie Engine im laufe ihrers Lebens darstellen soll im Voraus zu kennen. Aus diesem Grund geht man dazu über Effekt orientierte Engines zu schreiben. Die Grafikeffekte sind bei einer solchen Engine nicht mehr fest im Code einprogrammiert sondern sind als eigenständige Dateien vorhanden welche von der Engine geladen werden können. Eine solche Datei ist dabei nach folgendem Prinzip aufgebaut:


Effekt 1
Technologie 1 (DX7)
Pass 1
DX7 Vertex Settings
DX7 Pixel Settings
Pass 2
DX7 Vertex Settings
DX7 Pixel Settings
Pass 3
DX7 Vertex Settings
DX7 Pixel Settings
Pass 4
DX7 Vertex Settings
DX7 Pixel Settings

Technologie 2 (DX8)
Pass 1
VS 1.1 Programm
PS 1.1 Programm
Pass 2
VS 1.1 Programm
PS 1.1 Programm

Technologie 2 (DX9)
Pass 1
VS 2,0 Programm
PS 2.0 Programm
Effekt 2
....


Zusammengefast: Moderne DX-Engines enthalten einen Renderpfad der sowohl mit der configurierbaren und der programmierbaren DX-Schnitstelle arbeiten kann. Die genauen Informationen wie ein Effekt nun erreicht wird entnimmt die Engine aus entsprechenden Konfigurationsdateien.

Es dürfte nun auch hoffentlich verständlich sein das es nach wie vor jede zusätzlich unterstützte Technologie auch zusätzliche Arbeit bedeutet. Es müssen dafür zwar keine Änderungen an der eigentlichen Engine vorgenommen werden aber jemand muss die Datei mit den Effekten erweitern.

Diskussionsbeiträge und Nachfragen sind wie immer erwünscht.

mapel110
2003-04-28, 02:47:07
wie sieht das bei opengl aus ?

der r300 zb unterstützt ja auch die r200 extensions. also fällt da eine anpassung flach an ein technologie level ?

Demirug
2003-04-28, 13:03:47
Bei OpenGL funktioniert das leider ganz anders. Da dort die vereinheitlichung der API bisher immer etwas stärker hinter dem bereitstellen von neuen Features von seiten der IHVs hintergelaufen ist musste man bisher fast zwangsläufig auf die Hersteller spezifischen Extensions setzten.

Möchte man nun eine Effekt gesteuerte Engine bauen gibt es zwei möglichkeiten.

1. Man programmiert einen universellen Renderpfad welcher alle Extension von allen Herstellern unterstützt. In den Effektfiles legt man dann Chip abhängig entsprechenden Steuerinformationen ab.

z.B:

Effekt 1
Technologie 1 (Basis OpenGL)
Pass 1
OpenGL Settings
Pass 2
OpenGL Settings
Pass 3
OpenGL Settings
Pass 4
OpenGL Settings

Technologie 2 (NV20)
Pass 1
Register Combinersettings (NV spezifisch)
Pass 2
Register Combinersettings (NV spezifisch)

Technologie 3 (R200)
Pass 1
Fragment Processing settings (ATI spezifisch)

...
Effekt 2
...


Vorteile:
-Nahezu alle möglichen Effekte lassen sich auf den durch den Renderpfad unterstützen Chips auch wirklich umsetzten

Nachteile:
-Derjenige welcher diese Effektdateien schreibt muss über sehr viel Detailwissen über die einzelenen Chips verfügen.
-Da der gleiche Effekt für viele verschiedene Chips konfiguriert werden muss ist das ganze sehr viel arbeit.

2. Die Engine enthält mehrer Renderpfade für unterschiedliche Chips und die Effekte werden mit einer einheitlichen Sprache beschrieben.

Vorteile:
- Die Effektdateien sind einfacher zu schreiben da weniger Detailwissen erforderlicvh ist.

Nachteile:
- Es sind nur Effekte möglich welche sich mit der Sprache beschreiben lassen. Sollen zusätzliche Dinge realisiert werden muss die Engine und die Beschreibungssprache angepasst werden.
- Die Engine wird aufwendiger (Fehleranfälliger) weil zusätzlich für jeden Renderpfad die Effektbeschreibungssprache geparst und umgesetzt werden muss.

Ein generelles Problem hat man aber in jedem Fall:
- Jede neue Technologie für die es nur Herstellerspezifische Extensions gibt erfordern dass der Programmier die Engine für jeden Hersteller anpasst.

Um nach der langen Vorrede auf die Ausgangsfrage zurückzukommen.

Der R300 kann bei einer OpenGL Engine natürlich den für einen R200 vorgesehenen Weg benutzten. Möchte man die erweiterten fähigkeiten des R300 aber nutzen so müssen in jedem Fall zuerst die zusätzlichen Extension eingebracht werden (in den universalpfad (1) oder in einen neuen Spezialpfad (2)) und dann entweder alle Effektfiles erweitert werden oder ein neuer Parser geschreiben werden.

Müsste ich derzeit eine OpenGL Engine schreiben so würde ich den Weg mit dem Universalpfad gehen und zusätzlich ein Programm einsetzen welches aus einer allgemeinen Beschreibungssprache die Chipspezifischen Effektfiles erzeugt.

mapel110
2003-04-28, 18:19:56
Originally posted by Demirug
und zusätzlich ein Programm einsetzen welches aus einer allgemeinen Beschreibungssprache die Chipspezifischen Effektfiles erzeugt.

gibts sowas ?

Demirug
2003-04-28, 19:00:14
Originally posted by mapel110


gibts sowas ?

Nicht direkt zu kaufen

stanford hat aber schon lange so ein ähnliche Project.

und wir machen was ähnliches für DirectX.