Fx3D

Dieser Text richtet sich ausnahmsweise an Experten - wir bitten um Ihr Verständnis !


Offscreen-Surfaces


Fx3D-Logo

Die erste Version von Fx3D konnte Objekte nur bei einer Bildschirmauflösung von 320x400 Pixeln darstellen. Alle Dreiecke wurden direkt in den Speicher der Grafikkarte gerendert. Da sich Dreiecke gegenseitig überlappen und zusätzlich den Hintergrund verdecken, mussten bei diesem Verfahren Pixel mehrfach über den Bus zur Grafikkarte übertragen werden. Da jedes Pixel für sich gezeichnet wurde, konnte auch kein Write Combining durch den AGP-Chipsatz durchgeführt werden, was die Geschwindigkeit weiter herabgesetzt hat. Bei einer Auflösung von 320x400 Pixeln fiel dies allerdings nicht weiter auf.

Durch die Einführung eines verbesserten DOS-Extenders kann eine 3D-Applikation nun einen großen Speicherbereich anfordern, der genauso aufgebaut ist wie der Videospeicher: eine sog. „Offscreen-Surface“. Eine ebenfalls verbesserte Version von Fx3D rendert 3D-Objekte nun ausschließlich in eine solche Surface. Da sie im schnellen Arbeitsspeicher vorgehalten und nur einmal „am Stück“ zur Grafikkarte übertragen wird, erhöht sich die Geschwindigkeit beträchtlich, so dass nun beliebige Auflösungen verwendet werden können.


Pixelshader

Als „Pixelshader“ wird der Programmcode bezeichnet, der für die Darstellung von Bildpunkten eines 3D-Objekts verantwortlich ist. Moderne Grafikkarten können Pixelshader direkt im Grafikchip ausführen. Fx3D als Software-Renderer benutzt hierzu jedoch den Hauptprozessor. Die verschiedenen Pixelshader lassen sich anhand der gleichzeitig zu verarbeitenden Texturen einteilen. Die folgenden Bildschirmfotos zeigen einige wichtige Pixelshader. Sie wurden mit dem Fx3D-Demoprogramm angefertigt, das in DESKWORK enthalten ist. Die 3D-Auflösung wurde dazu auf 640x480 reduziert, um die Dateigröße zu begrenzen. Die Framerate von 30 fps ist hier optimal, da DESKWORK alle 3D-Objekte in der Regel in halber Bildwiederholrate (also die Hälfte von 60 oder 70 Hertz) rendert. Ohne diese Begrenzung und ohne Synchronisierung mit dem Vertical Retrace der Grafikkarte wären Frameraten jenseits von 100 fps möglich, die aber nicht mehr flimmerfrei dargestellt werden könnten.


Pixelshader ohne Textur

Die einfachsten Pixelshader in Fx3D arbeiten ganz ohne Texturen. Im einfachsten Fall werden nur die Umrisse der Dreiecke in einer einheitlichen Farbe gezeichnet:


Linien

Im Regelfall werden die Dreiecke des 3D-Objekts jedoch vollständig ausgefüllt. Im einfachsten Fall erhalten alle Pixel dieselbe Farbe, die sich jedoch nach dem Winkel zwischen Fläche und Lichtquelle richten kann und so eine Lambert-Schattierung erlaubt:


Einfarbige Flächen mit Lambert-Schattierung

Die Dreiecke können auch transparent ausgefüllt werden. Dieser Pixelshader profitiert besonders vom Rendern in eine Offscreen-Surface, denn beim Rendern in den Videospeicher müsste für jedes Pixel der bereits vorhandene Farbwert aus dem Grafikspeicher ausgelesen und die neue Farbe zurückgeschrieben werden. Dadurch würde sich nicht nur die zu übertragende Datenmenge verdoppeln, sondern die Leistung bräche auch durch den langsamen Transfer von der Grafikkarte zur CPU zusammen.


Einfarbige Flächen mit Transparenz



Pixelshader mit 1 Textur

Neben einfarbigen Flächen kann Fx3D auch Texturen zur Darstellung von 3D-Objekten verwenden. Im einfachsten Fall wird die Textur direkt und ohne weitere Veränderung dargestellt. Ein etwas komplexerer Pixelshader kann die Textur vorher aufhellen oder abdunkeln, so dass eine Lambert-Schattierung entsteht:


Textur mit Lambert-Schattierung

Ein anderer Pixelshader prüft vor dem Bearbeiten eines Texels, ob es durchsichtig ist oder nicht. Auf diese Weise werden Formtexturen realisiert, die teilweise durchsichtig sind:


Formtextur mit Lambert-Schattierung

Wird das Mapping der Textur nicht an den Eckpunkten der Dreiecke, sondern an ihren Normalenvektoren ausgerichtet, können Objekte mit einer Phong-Schattierung versehen werden, die besonders für runde Oberflächen geeignet ist:


Phong-Schattierung



Pixelshader mit 2 Texturen

Fx3D enthält aufwändige Pixelshader, die mit mehr als einer Textur gleichzeitig arbeiten, dafür allerdings auch eine höhere Rechenleistung erfordern. So ist es möglich, eine Textur mit einer Phong-Schattierung zu versehen:


Umgebungstextur mit Phong-Schattierung



Pixelshader mit 3 Texturen

Der einzige Fx3D-Pixelshader, der mit drei Texturen gleichzeitig arbeitet, benutzt eine Textur und versieht sie mit einer Phong-Schattierung. Diese wird jedoch von einer dritten Textur, der Bumpmap, gesteuert, so dass ein Gravureffekt auf der Oberfläche entsteht:


Umgebungstextur mit Phong-Schattierung und Bump-Textur



Performanz

Da Fx3D anders funktioniert als heute gebräuchliche 3D-Systeme, sind auch andere Faktoren für die Leistungsfähigkeit verantwortlich. Falls die Geschwindigkeit des Computers nicht ausreicht, kann die Auflösung reduziert werden:


3D-Auflösung



CPU, Cache und Speicher

Durch das Rendern der 3D-Objekte in den Arbeitsspeicher spielt die Leistung Grafikkarte zunächst einmal keine Rolle, vielmehr kommt es auf eine schnelle CPU und schnellen Arbeitsspeicher an. In modernen Systemen ist der Prozessor deutlich schneller getaktet als der Arbeitsspeicher. Aus diesem Grund verfügt die CPU über ein abgestuftes System aus Caches (L1 bis L3), die häufig benötigte Teile des RAMs direkt im CPU-Chip in sehr schnellen Speicherbausteinen vorhalten. Die Größe des CPU-Caches ist für die Leistung von Fx3D entscheidend. Dies liegt nicht nur daran, dass jedes Pixel eines Dreiecks in den Arbeitsspeicher geschrieben werden muss, auch die Pixelshader greifen pro Bildpunkt und Textur mindestens einmal auf den Arbeitsspeicher zu. Gerade Texturzugriffe erfolgen dabei nicht an aufeinander folgende Adressen; ist der L1-Cache des Prozessors zu klein, müssen ständig Cachelines zeitaufwändig nachgeladen werden, was zu deutlichen Leistungseinbußen führen kann. Die Pixelshader in Fx3D arbeiten optimal mit mindestens 32 KB L1-Datencache pro Polygontextur.


Grafikkarte und Bus

Nachdem alle 3D-Objekte in die Offscreen-Surface gerendert wurden, muss der Inhalt vom Arbeitsspeicher in den Speicher der Grafikkarte kopiert werden, um schließlich angezeigt zu werden. Da hier Schreibzugriffe an aufeinander folgende Adressen stattfinden, stellt dies für moderne AGP-Grafikkarten dank „Write Combining“, das von DESKWORK aktiviert wird, kein Problem dar. Auch gute PCI-Karten, etwa mit S3-Chip, sind leistungsfähig genug.

Grafikkarten, die über PCI-Express (PCIe) angebunden sind, bieten eine noch höhere Geschwindigkeit. Bei PCIe-Systemen sollte darauf geachtet werden, dass der Grafikkarte die maximalen 16 Lanes zur Verfügung stehen:


2 herkömmliche PCI-Slots, 4 PCIe-Slots mit 1 Lane, 1 PCIe-Slot mit 16 Lanes



Zukunftsaussichten


Parallelisierte Renderhardware (Diamond Monster 3D)

Fx3D bietet trotz reinem Software-Rendering eine hinreichende Leistung für die Darstellung von 3D-Objekten in DESKWORK. Sollten zukünftig DESKWORK-Applikationen entwickelt werden, die mehr Leistung erfordern, kann Fx3D noch weiter optimiert werden.


Mehrkern-Prozessoren (dual core, quad core)

Das Rendern von Dreiecken erfolgt zeilenweise. Diese Aufgabe kann parallelisiert werden, so dass beispielsweise ein Thread alle geraden Scanlines zeichnet, während ein zweiter Thread alle ungeraden Scanlines übernimmt. Eine solche Aufteilung macht auf herkömmlichen CPUs keinen Sinn, da sich beide Threads ohnehin die Rechenleistung derselben CPU teilen müssten. Bei Mehrkern-Prozessoren hingegen würde sich die Leistung der Pixelshader annähernd verdoppeln bzw. vervierfachen. Da sich Mehrkern-Prozessoren immer mehr durchsetzen, ist dies eine sehr wahrscheinliche Optimierung für zukünftige Fx3D-Versionen, zumal diese Technik auch andere CPU-lastige Operationen wie das Berechnen von Fraktalen beschleunigen würde.


Spezial-Mainboard mit vier AMD Opteron-Prozessoren



3D-Grafikkarten

Eine weitere Optimierung kann darin liegen, die oben beschriebenen Offscreen-Surfaces statt im Hauptspeicher im Speicher der Grafikkarte zu erzeugen, sofern diese über genügend RAM verfügt. Dies scheint zunächst widersinnig, da dann wieder alle Pixel über den Bus übertragen werden müssen statt in den schnelleren Arbeitsspeicher - bei sich überlappenden Dreiecken auch noch mehrfach.

Dem gegenüber steht jedoch die enorme Zeitersparnis, die durch die Nutzung von Beschleunigungerfunktionen der Grafikkarte entsteht. DESKWORK nutzt bereits die 2D-Beschleunigung von vielen Grafikkarten, zum Beispiel der Hersteller ATI, Intel, Matrox oder S3. Dadurch ist es möglich, sehr schnell ausgefüllte Rechtecke in den Grafikspeicher zu schreiben, ohne dass jedes Pixel einzeln übertragen werden muss. Auch können so schnell und ohne Buszugriffe Bereiche innerhalb des Videospeichers verschoben werden. Grafikkarten mit 3D-Beschleunigung besitzen weitere Funktionen zum direkten Zeichnen von Polygonen in den Grafikspeicher, wobei ungenutzte Teile des Videospeichers für Texturen genutzt werden müssen.


Moderne 3D-Grafikkarte mit 512 MB Grafikspeicher (S3 Chrome S27)



Weitere Informationen

In diesen Dokumenten finden Sie weiterführende Informationen zu Fx3D.

Fast affine texture mapping
Mats Byggmästar (Doomsday)
Stand: 07.12.2004