Hoe werkt een 3D grafische kaart - Deel 2

Inhoudsopgave
  1. 1. De pixel rendering engine
  2. 2. Shading
  3. 3. Texture Mapping
  4. 4. Texture Filtering
  5. 5. Atmosferische Effecten
  6. 6. Z-Bufering
  7. 7. Verdere 3D Effecten
  8. 8. Verdere 3D Effecten (vervolg)
  9. 9. De AGP Interface
  10. 10. De Software Aansturing
  11. 11. Reacties

De pixel rendering engine

Dit artikel is oorspronkelijk geschreven voor de Computer!Totaal van Maart 2000.

De 3D afbeeldingen voor dit artikel zijn speciaal gemaakt door Frank van Heesch (http://www.stack.nl/~fidget/).

Hoe werkt een 3D grafische kaart? - Deel 2: Dieper de chip in!

In deel 1 van dit artikel hebben we al een korte inleiding gegeven in de werkwijze van een 3D videokaart. We hebben bekeken hoe een 3D afbeelding wordt opgebouwd en we hebben het zes stappenplan van 3D rendering geanalyseerd. In dit tweede deel van dit artikel zullen de laatste stap van dit zes stappenplan wat nader gaan bekijken. Deze zogenaamde 'pixel rendering engine' draagt van alle stappen namelijk verreweg het meeste bij aan het hele proces. Hierna zullen we de werkwijze van enkele nieuwe 3D effecten en technieken uit de doeken doen. Verder bekijken we ook de AGP interface van de nieuwe generatie videokaarten besteden we even kort aandacht aan de software aansturing van de 3D videokaarten.

De pixel rendering engine

In het vorige deel van dit artikel heeft u kunnen lezen dat de 3D chip in stap 5 van het 3D rendering proces de uiteindelijk gebruikte driehoeken omrekent naar een set pixels die deze driehoek op het scherm behelst. Het is nu de taak van de pixel rendering engine om de uiteindelijke kleur van alle pixels op het scherm te berekenen. Dit gehele proces gebeurt pixel voor pixel en iedere pixel waarvan de uiteindelijke kleur berekend is, wordt door de rendering engine in de zogenaamde back buffer geplaatst. Zoals we vorige maand al gezien hebben, wordt het 3D beeld in deze back buffer opgebouwd en zodra een geheel beeld berekend is, wordt de back buffer gekopieerd naar de front buffer en wordt de afbeelding op het scherm vertoond. De pixel rendering engine begint dan in de back buffer weer van voren af aan voor het volgende frame.

Bij het berekenen van de uiteindelijke kleur van een pixel kunnen we twee belangrijke zaken onderscheiden: het berekenen van de globale kleur van een pixel en het later toepassen van enkele effecten. De wijze van berekenen van de globale kleur van een pixel vloeit voort uit de verschillende manieren waarop 3D objecten kunnen worden ingekleurd. Dit inkleuren heet binnen het 3D jargon "shaden".

Shading

Er zijn twee verschillende shading-technieken die 3D chips hardwarematig kunnen uitvoeren: flat shading en Gouraud shading. Flat shading is de simpelste manier van inkleuren: bij dit systeem krijgt ieder polygoon uit een 3D object één egale kleur. Een voorbeeld van flat shading zien we bij de torusknoop in figuur 1. Welke kleur er wordt gebruikt volgt uit de informatie die de pixel rendering engine krijgt uit de vorige stappen van het 3D rendering proces. Bij flat shading zien we ook maar al te duidelijk dat de 3D objecten zijn opgebouwd uit driehoeken.


Figuur 1 - Een torus-knoop met behulp van Flat Shading

Een mooiere manier van shaden is Gouraud shaden. Deze methode vraagt dan ook niet voor niets heel wat meer rekenkracht van de 3D chip. Bij dit systeem wordt voor ieder hoekpunt (vertex in het 3D jargon) van alle polygonen de gewenste kleur berekend. De kleuren van de pixels binnen de polygonen worden berekend via interpolatie, zodat er een mooie kleurovergang binnen alle driehoeken ontstaat binnen. In figuur 2 is dezelfde torusknoop als uit figuur 1 te zien, alleen dan met Gouraud shading. Het verschil is meteen duidelijk. Aangezien Gouraud shading heel wat meer rekenkracht vraagt, is het ook wel te verklaren dat dit systeem vroeger, toen er nog geen 3D hardware was, nooit werd toegepast bij real-time 3D programmatuur. Sinds de komst van de 3D versnellers wordt juist flat shading bijna niet meer toegepast.


Figuur 2 - Een torus-knoop met behulp van Gouraud Shading

Naast flat shading en Gouraud shading zijn er ook nog twee andere shading technieken: Phong en metal shading. Deze twee vereisen echter zo verschrikkelijk veel rekenkracht, dat deze systemen met onze huidige hardware nog niet real-time toegepast kunnen worden. Phong en metal shading vinden we dan ook alleen maar terug bij 3D rendering pakketten zoals bijvoorbeeld 3D Studio MAX. Wellicht dat in 3D versnellers van de toekomst ook ooit Phong en metal shading wordt toegepast.

Texture Mapping

Een andere manier om 3D objecten in te kleuren en het realisme van de 3D afbeelding te vergroten, is het toepassen van texture mapping. Hierbij wordt een bitmap afbeelding geplaatst op de gewenste 3D polygonen. Zo ontstaan zeer realistische afbeeldingen zonder dat daar erg veel polygonen voor nodig zijn.

De aarde zouden we bijvoorbeeld kunnen modelleren door miljarden kleine polygonen met elk de juiste kleur van het plaatselijke terrein type. Zelfs de snelste computers zouden dit 3D object dan nog niet real-time kunnen manipuleren. Simpeler is het om gewoon een standaard bol te nemen en daar een afbeelding van de aarde overheen te plakken. We hebben dan maar erg weinig polygonen nodig, terwijl het resultaat er vrijwel even realistisch uitziet. In figuur 3 zien we zo'n standaard bol: een relatief simpel 3D object. In figuur 4 is er een afbeelding (een texture dus) van de aarde opgeplakt en zo ziet die simpele bol er ineens echt uit als onze planeet.

Figuur 3 - Een standaard bol Figuur 4 - Dezelfde bol maar nu met een texture van onze aarde

Bij huidige 3D spellen wordt vrijwel alleen nog maar gebruik gemaakt van texture mapping. Aangezien het toepassen van texture mapping veel minder processorkracht vereist dan het anderzijds opdelen van 3D objecten in veel meer polygonen, is het mogelijk om zeer realistische 3D beelden toch nog met meer dan 30 frames per seconde over het scherm te laten rollen. In spellen als Quake zijn de muren, vloeren en plafonds bijvoorbeeld platte vierkanten met daarop een texture van bakstenen of iets dergelijks.

Bij het toepassen van texture mapping is er een zeer belangrijk aspect, wat niet vergeten mag worden om een realistisch resultaat te krijgen, namelijk de perspectief correctie. Als een texture verdwijnt in de diepte moet de afbeelding geleidelijk convergeren voor een realistisch resultaat. Dat dit nodig is kunt u zelf makkelijk bedenken: als u aan het begin van een lange weg staat en ver vooruit kijkt ziet u ook dat deze steeds smaller lijkt te worden.

In figuur 5 en 6 zien we twee afbeeldingen, in de eerste is de perspectief correctie niet toegepast en in de tweede wel. Het verschil is meteen duidelijk.

Figuur 5 - Geen perspectief correctie Figuur 6 - Wel perspectief correctie

Mensen die zich het spel Tomb Raider 1 nog kunnen herinneren, weten meteen wat het resultaat van verkeerd gebruik van perspectief correctie is. In dit spel werd namelijk op veel plaatsen de perspectief correctie niet toegepast. Hoewel dit in sommige situaties (zoals bij kleurverlopen of bij zeer onregelmatige textures) niet opvalt, had dit als gevolg dat sommige scènes erg vreemd uitzagen. In Tomb Raider 2 werd de perspectief correctie wel toegepast en dit resulteerde meteen in veel realistischere beelden.

Texture Filtering

Zoals u wel begrijpt heeft de oorspronkelijke texture nooit precies hetzelfde formaat als het 3D object waar de afbeelding op geplaatst moet worden. Uit de pixels van de texture (die in het 3D jargon 'texels' worden genoemd) moeten dus op één of andere manier de kleuren van alle pixels van het 3D object worden afgeleid.

De makkelijkste en snelste manier om dit te doen heet point sampling of point filtering. Hierbij wordt voor iedere pixel de kleur van de dichtstbijzijnde texel gekopieerd. Dit systeem wordt daarom ook wel de 'nearest' methode genoemd. Hoewel point sampling erg snel gaat, heeft het ook een aantal nadelen. Indien het 3D object veel kleiner is dan de oorspronkelijk texture kan er veel detail verloren gaan, omdat veel texels gewoonweg verwaarloosd worden. Als een dergelijk object dan gaat bewegen kan het ook zijn dat het een beetje knipperend overkomt, aangezien kleine details in de texture soms wel en soms niet zichtbaar zijn. Als het 3D object echter groter is dan de oorspronkelijk texture ontstaat er weer een ander probleem. Het resultaat wordt dan erg blokkerig, aangezien een enkele texel dan identiek op meerdere pixels wordt geprojecteerd. Iedereen herinnert zich nog wel hoe blokkerig de graphics van spellen als Doom 1 en Doom 2 werden als je tegen een muur aanliep. Dit komt doordat in deze spellen alleen maar van point sampling gebruik werd gemaakt.

Een systeem om deze twee problemen al een beetje tegen te gaan is bilinear filtering. Bij bilinear filtering wordt niet alleen naar de dichtstbijzijnde texel gekeken, maar wordt de uiteindelijke kleur berekend door de kleuren van de vier dichtstbijzijnde texels naar verhouding te vermengen. Dit systeem is dus in principe te vergelijken met het anti-aliasing systeem, met dien verstande dat er met maximaal vier texels rekening wordt gehouden. De resultaten zijn in ieder geval stukken beter dan met point sampling.

In figuur 7 en 8 zien we duidelijk de voordelen van bilinear filtering ten opzichte van point sampling. In figuur 7 zien we een 3D object waarbij de texture flink verkleind is. Rechts zien we het resultaat met point sampling (waar dus veel detail verloren gaat) en links het resultaat met bilinear filtering. Een gedeelte van de oorspronkelijke texture is ook in de afbeelding te vinden. In figuur 8 zien we juist het andere probleem, namelijk een texture die flink vergroot moet worden. (Dus bijvoorbeeld het "tegen een muur aanlopen" in een 3D game.) Rechts het erg blokkerige resultaat van point sampling (zoals in Doom 1 en 2) en links het al betere resultaat van bilinear filtering (zoals bijvoorbeeld in Quake). In de afbeelding is ook de oorspronkelijk texture te zien. 


Figuur 7 - De voordelen van bilinear filtering bij sterk verkleinde textures
(links: bilinear filtering / rechts: point filtering)


Figuur 8 - De voordelen van bilinear filtering bij sterk vergrote textures
(links: bilinear filtering / rechts: point filtering)

Sinds de komst van de 3D versnellers is bilinear filtering al meer dan standaard. Maar er zijn een aantal andere, nog mooiere texture mapping systemen die steeds meer gebruikt worden.

Iets wat in 3D games steeds meer gebruikt wordt zijn de zogenaamde MIP-maps. MIP is een afkorting voor het Latijnse "Multum in Parvo" wat "Meerdere in Één" betekent. In een MIP-map worden dan ook meerdere versies van een texture opgeslagen. Elke nieuwe variant is weer de helft kleiner als de vorige en door de auteur zorgvuldig met behulp van anti-aliasing verkleind. Een voorbeeld van een MIP-map zien we in figuur 9.


Figuur 9 - Een voorbeeld van een MIP-map

Bij het toepassen van texture mapping zoekt de 3D videokaart nu het meest ideale textureformaat uit de MIP-map. Op de gekozen texture wordt meestal weer bilinear filtering toegepast. Om de kwaliteit van MIP-mapping te behalen met een filtering methode zouden veel grote tweedimensionale filters noodzakelijk zijn.

Toch heeft ook MIP-mapping een nadeel. Als een 3D object zich naar voren of naar achteren verplaatst, wordt er op een gegeven moment van MIP level veranderd. Deze resolutiesprong is vaker goed zichtbaar. Om dit tegen te gaan is er nog een trilinear filtering systeem. Bij trilinear filtering wordt eerst op de twee meest ideale MIP levels bilinear filtering toegepast. Uit de twee resultaten wordt door middel van interpolatie de uiteindelijke kleur gefilterd. Trilinear filtering is de methode waarbij verreweg de mooiste resultaten worden behaald, maar het systeem vraagt ook zeer veel van de 3D chip. Ook is er bij trilinear filtering veel meer geheugen bandbreedte nodig, aangezien er steeds twee MIP levels gebruikt worden.

Bij nieuwe spellen als Quake 3 kan trilinear filtering al zonder problemen worden toegepast. De resultaten zijn absoluut verbluffend, maar de snelheid kan flink terugvallen ten opzichte van standaard bilinear filtering. Nog mooier dan trilinear filtering is het nieuwe anisotropic filtering. Aangezien deze methode nog vrijwel niet toegepast wordt, zal ik hem hier verder niet behandelen.

Atmosferische Effecten

Als door middel van shading of texture mapping de globale kleur van een pixel bekend is geworden, kunnen er aan het eind van de pixel rendering engine nog enkele atmosferische effecten worden toegepast om een nog realistischer effect te krijgen. Twee veel gebruikte (en relatief simpele) atmosferische effecten zijn het 'fog' (mist) effect en het 'depth-of-field' effect.

Bij het fog effect worden de kleuren steeds meer vermengd met de bepaalde fog-kleur naarmate het 3D object zich verder van de kijker bevindt. Zoals de naam het al aangeeft kan het fog effect bijvoorbeeld perfect gebruikt worden voor mist of rook effecten.

Bij het depth-of-field effect wordt er slechts één bepaalde dieptegraad 100% scherp weergegeven. Objecten die ofwel ver weg ofwel dicht bij zijn worden door het depth-of-field effect waziger weergegeven. Bedenk dat depth-of-field een standaard bijwerking van foto- en filmlenzen is. Iets wat bij films standaard aanwezig is, moet bij 3D graphics apart worden gegenereerd.

In de figuren 10, 11 en 12 zien we voorbeelden van het fog en het depth-of-field effect. In figuur 10 zien we een spoorrails met enkele bomen zonder enig verder effect. In figuur 11 is hier het fog effect aan toegevoegd, het resultaat is meteen duidelijk: de achterste bomen zijn al voor een groot gedeelte vermengd met de grijze fog-kleur. In figuur 12 zien we weer de rails met bomen, alleen dan met het depth-of-field effect. Duidelijk is dat de achterste bomen en de voorste spoorbiels erg wazig zijn.

Figuur 10 - Rail standaard Figuur 11 - Rail met Fog effect

Figuur 12 - Rail met Depth-of-Field effect

Een ander effect dat we zeker niet mogen vergeten is alpha blending. Bij alpha blending kunnen objecten gedeeltelijk transparant zijn. De kleur van een pixel wordt dan voor een gedeelte vermengd met de kleur van de pixel die er achter ligt. In 3D spellen wordt bijvoorbeeld bij ramen alpha blending toegepast. Aan alle pixels kunnen zogenaamde alpha-waarden toegekend worden die aangeven hoe groot de transparatie-waarde van een pixel is.

Z-Bufering

Er is nog een punt waar we in de pixel rendering engine expliciet rekening moeten houden. In het vorige artikel heb ik er al kort over gesproken: de Z-buffer. De Z-buffer houdt voor iedere pixel bij hoe ver deze zich bevindt ten opzichte van de kijker. Dat deze Z-buffer noodzakelijk is zien we in het volgende voorbeeld.

Zoals we in het vorige artikel hebben kunnen zien, zorgen de eerste stappen van het 3D rendering proces ervoor dat verschillende 3D objecten op volgorde van afstand tot de gebruiker worden verwerkt. Objecten die het verst weg zijn worden het eerst gerenderd en objecten die dichterbij zijn worden daarna over de verdere objecten heen geplaatst. Dit Z-sorting systeem voldoet indien er geen objecten zijn die in elkaar overgaan. Zodra dit gebeurt moet er per pixel bijgehouden worden wat de diepte is. Deze informatie wordt dus, zoals al gezegd, opgeslagen in de zogenaamde Z-buffer. Als er nu op de plaats van een bestaande pixel een nieuwe pixel moet worden getekend, wordt deze alleen verwerkt als hij zich dichterbij bevindt dan de bestaande pixel. In de figuren 13 en 14 is het resultaat duidelijk te zien. In figuur 13 zien we drie cilinders waarbij alleen van Z-sorting gebruik is gemaakt. Het resultaat is dat deze cilinders "op elkaar" liggen. In figuur 14 is de Z-buffer ingeschakeld, die het mogelijk maakt dat deze cilinders in elkaar overgaan.

Figuur 13 - Cilinderkruis zonder Z-Buffering Figuur 14 - Cilinderkruis met Z-Buffering

In het vorige artikel hebben we al gezien dat de Z-buffer een behoorlijk brok geheugen vereist. Echter hoe groter deze Z-buffer hoe minder 'dieptefouten' er worden gemaakt.

Verdere 3D Effecten

Als u tegenwoordig de doos van een 3D videokaart bestudeert, wordt u waarlijk overspoelt door termen van 3D effecten. Veel van deze termen en effecten hebben we ondertussen al besproken. Van zaken als "hardware transformation & lightning" en "trilinear filtering" zal ondertussen niemand meer zijn wenkbrauwen fronsen. Toch zijn er nog een aantal 3D effecten die we nog niet behandeld hebben, waarmee fabrikanten van 3D chips de laatste tijd groots adverteren. De belangrijkste zullen we nu even kort bekijken:

Bump mapping

In het voorgaande stuk tekst over texture mapping hebben we gezien dat het gebruiken van textures voor zeer realistische resultaten kan zorgen. Probleem blijft echter dat de 3D objecten er 'plat' uit blijven zien. Met bump mapping kan er echter een soort reliëf worden gecreëerd. Dit reliëf ontstaat door de lichtuitval per pixel te wijzigen. Het object blijft plat, maar het ziet er uiteindelijk absoluut niet meer plat uit. In figuur 15 zien we een voorbeeld van bump mapping. Rechts zien we weer het standaard 3D model van de aarde. Merk dat op het oppervlak geheel plat is. Op de linker afbeelding van de aarde is echter bump mapping toegepast. We zien hier dan ook een duidelijke reliëfwerking. Als deze reliëfwerking gemodelleerd zou moeten worden met meerdere polygonen zou dat tientallen keren meer processorkracht vragen.


Figuur 15 - Een prachtig voorbeeld van Bump Mapping 

Hoewel steeds meer videokaarten ondersteuning voor bump mapping hebben, wordt het effect helaas nog steeds niet erg veel toegepast. Een voorbeeld van een spel met Bump Mapping is Expendable, waar enkele prachtige wateroppervlak-effecten gegenereerd worden met behulp van bump mapping.

De precieze werkwijze van bump mapping zal ik in dit artikel niet verder bespreken. Wel wil ik nog even opmerken dat er een aantal verschillende bump mapping systemen bestaan. Meestal bedoelden fabrikanten met bump mapping het 'embossed bump mapping' systeem. Matrox heeft op haar G400 videokaarten echter een ander bump mapping systeem, te weten 'environment mapped bump mapping'. Dit laatste bump mapping systeem zorgt voor nog mooiere resultaten.

Texture compression

Iedereen kan zich wel voorstellen dat hoe gedetailleerder de textures, hoe mooier de uiteindelijke 3D beelden zijn. Erg gedetailleerde (en dus erg grote) textures vragen echter zeer veel geheugenbandbreedte. Het is daarom vrijwel onmogelijk om veel gedetailleerde textures in één 3D scène te gebruiken. Een systeem dat dit echter wel mogelijk maakt is texture compression. Hierbij worden alle textures gecomprimeerd over de databus gezonden. De vereiste bandbreedte kan zo tot 8 keer worden verkleind. Texture compression maakt het dus mogelijk om zeer detailrijke textures te gebruiken in spellen, iets wat het realisme uiteraard weer ten goede zal komen.

Het is voornamelijk S3 die flink aan de weg timmert met het texture compression systeem. Hun 'S3TC' systeem is onder andere terug te vinden in de Savage 4 en de Savage 2000 chips. Bij het nieuwe spel Unreal Tournament wordt zelfs een extra cd met extra gedetailleerde textures meegeleverd, speciaal voor deze S3 videokaarten. Ook nVidia heeft sinds de GeForce videokaarten ondersteuning voor texture compression. In de toekomstige Voodoo 4 en Voodoo 5 videokaarten zal 3dfx ook een eigen texture compression systeem (FXT1 genaamd) verwerken.

Verdere 3D Effecten (vervolg)

Cube Environment Mapping

Iets wat tot nu toe vrijwel niet mogelijk was met de huidige 3D chips zijn realistische weerspiegelingen van de buitenwereld op een 3D object. Om dit nu ook mogelijk te maken is bij de nieuwe GeForce chip van nVidia het cube environment mapping systeem geïntroduceerd. Dit systeem wordt ook toegepast in professionele 3D rendering software als 3D Studio Max. De werking van cube environment mapping komt in principe op het volgende neer: het 3D object waar een weerspiegeling op moet komen wordt "ingepakt" in een kubus. Vanuit alle zes de kanten van de kubus wordt vanuit het 3D object naar buiten gekeken en wordt de 3D scène nogmaals opnieuw gerenderd. Zo krijg je een 100% realistische weerspiegeling vanuit die zes richtingen. Weerspiegelingen die niet precies vanuit één van deze zes richtingen komen, worden door interpolatie bepaald. Het fijne van een kubus is dat altijd maar maximaal drie kanten zichtbaar zijn, tenzij er meer weerspiegelende object bij elkaar staan. Meer dan drie extra beelden hoeven dus in de meeste gevallen niet gerenderd te worden. Figuur 16 zal één en ander nog wat verduidelijken.


Figuur 16 - Cube Environment Mapping

De kwaliteit van het cube environment mapping systeem is zeer goed. In een demo die bij de de meeste GeForce kaarten wordt geleverd zie je de weerkaatsing van de buitenwereld op een rijdende glimmende brandweerauto. Deze weerspiegelingen zijn zo verschrikkelijk mooi en realistisch dat het moeilijk te geloven was dat dergelijke zaken real-time berekend konden worden. 

Anti-aliasing

De term anti-aliasing wordt meestal gebruikt voor het afronden van randen van objecten. Indien een lijn op het scherm wordt getekend die niet helemaal horizontaal of helemaal verticaal is, dan is deze niet helemaal recht, maar als gevolg van de pixel-matrix een beetje trapvormig. Anti-aliasing verbetert deze trapvormigheid door de pixels nabij de rand een beetje in kleur te veranderen, waardoor het geheel meer op een rechte lijn lijkt. Een voorbeeld van anti-aliasing is in figuur 17 te zien: links is de rand van het 3D-object niet afgerond, maar rechts gebeurt dit wel door middel van anti-aliasing. Ook anti-aliasing vraagt heel wat power van de 3D chip. Vandaar dat het nog maar zelden wordt toegepast in 3D games.


Figuur 17 - Anti-Aliasing

Vertex Blending

Vertex blending is een systeem dat zonder bewegende beelden in principe moeilijk uit te leggen is. Toch kunnen we wel een tipje van de sluier oplichten. Als voorbeeld nemen we een 3D model van de arm van een mens. Normaal gesproken bestaat dit uit twee cilinders: een voor de bovenarm en een voor de onderarm. Als je dit model echter laat bewegen zullen er op het overgangspunt gaten in het model komen. Het vertex blending systeem laat beide primitieven echter dynamisch en vloeiend in elkaar overgaan. Zo kunnen zeer natuurgetrouwe bewegingen ontstaan zonder hier extra maatregelen voor te nemen. Figuur 18 kan één en ander wellicht iets verduidelijken. Bij de bovenste twee rechthoeken zien we duidelijk het gat bij de "knik". Bij de onderste twee is dit echter keurig afgerond en is het gat niet meer te zien.


Figuur 18 - Vertex Blending

De AGP Interface

Nu we vrijwel de gehele interne werking van de 3D chip hebben besproken, is het nog even interessant om te kijken naar de verbinding tussen de 3D chip en de rest van de PC. Tot twee jaar terug was de PCI bus standaard voor videokaarten. Deze 32 bits bus die op 33 MHz werkt, heeft een bandbreedte van 133 MB/s [(32/8) * 33], wat meer dan voldoende was voor de 2D videokaarten van weleer. In de huidige tijd van 3D versnellers is de PCI bus echter absoluut niet meer afdoende. Aangezien er een zeer grote bandbreedte benodigd is (onder andere voor het kopiëren van textures van het standaard RAM naar het videogeheugen) heeft men de AGP bus uitgevonden. Deze nieuwe bus (te herkennen aan het bruine slot op het moederbord) werkt op 66 MHz en behaalt daarmee al standaard een bandbreedte van 266 MB/s. Maar dat is nog niet alles: een nieuwe versie van AGP (AGP 2X) kan zowel op de positieve als op de negatieve flank van de klok data overdragen, wat resulteert in een bandbreedte van 532 MB/s. Met de komst van de Intel 820 Pentium III en de VIA KX133 Athlon chipset is er zelfs alweer een AGP 4X standaard, waarbij de klok intern met een factor vier vermenigvuldigd wordt. De zo verkregen bandbreedte van 1064 MB/s kan echter nog lang niet volledig benut worden, aangezien de bandbreedte van PC100 RAM-geheugen "slechts" 800 MB/s is [(64/8) * 100] en deze bandbreedte ook nog eens gedeeld moeten worden met de CPU en andere componenten.

Toch is deze hogere bandbreedte niet het enige voordeel van AGP ten opzichte van PCI. De twee grootste voordelen zijn 'sideband addressing' en 'direct memory execution'.

Bij een PCI videokaart is het zo dat de videokaart, na een aanvraag voor een stuk data uit het RAM geheugen, met de volgende aanvraag moet wachten tot de data van de eerste aanvraag is gearriveerd. Zo ontstaan voortdurend onnodige wachttijden, wat resulteert in een inefficiënt gebruik van de databus. Bij AGP is er echter het sideband addressing systeem, dat dit probleem verhelpt. Een aparte (smallere) bus wordt speciaal gebruikt voor het versturen van aanvragen voor data. Deze aanvragen kunnen de hele tijd zonder vertraging achter elkaar door gestuurd worden. De eigenlijke databus wordt met dit systeem zeer efficiënt gebruikt, aangezien hier de hele tijd de data overdracht op plaatsvindt. Figuur 19 verduidelijkt dit systeem.


Figuur 19 - AGP Sideband Addressing

Het tweede grote voordeel van AGP is het 'direct memory execution' of kortweg DIME systeem. DIME houdt in dan een AGP videokaart rechtstreeks het RAM geheugen van de PC kan gebruiken (zonder hiervoor de CPU te gebruiken) en dit te gebruiken alsof het lokaal videogeheugen is. Het voordeel hiervan wordt meteen duidelijk met het volgende voorbeeld: bij een PCI videokaart moet alle data die gebruikt wordt (bijvoorbeeld de textures van een 3D scène) in het lokale videogeheugen staan. Indien de totale hoeveelheid textures nu groter is dan het videogeheugen zal er de hele tijd data uitgewisseld moeten worden tussen het RAM geheugen en het video geheugen. Een AGP videokaart die DIME ondersteunt kan echter de benodigde textures ook direct vanuit het RAM geheugen gebruiken. DIME vangt zo een mogelijk gebrek aan voldoende videogeheugen meteen op.

De grote voordelen van AGP ten opzichte van PCI hebben ervoor gezorgd dat vrijwel alle nieuwe 3D videokaarten alleen nog maar in AGP uitvoering verkrijgbaar zijn. Van sommige modellen (zoals de Voodoo3 kaarten van 3dfx) zijn echter ook nog PCI uitvoeringen te krijgen, puur voor PC's die nog geen AGP bus hebben.

De Software Aansturing

We sluiten dit artikel af met een korte blik op de software aansturing van een 3D videokaart. Aangezien iedere 3D chip anders aangestuurd dient te worden, zou het voor programmeurs van 3D spellen vrijwel onmogelijk zijn om ondersteuning te hebben voor alle 3D videokaarten, als er niet nog een extra stukje programmatuur tussen het spel en de 3D chip zou zitten. Dit stukje programmatuur dat ervoor zorgt dat de 3D software met vele verschillende 3D videokaarten werkt, is de zogenaamde 3D API.

Een API (advanced programming interface) is een verzameling van routines die gebruikt kunnen worden voor een bepaald doel: in ons geval het renderen van 3D werelden. Een belangrijk deel van de 3D API is de zogenaamde HAL (hardware abstraction layer): een soort tussenslag tussen software en hardware. De diverse 3D API's worden gebruikt om de volgende redenen: een programmeur van een 3D-spel hoeft zich d.m.v. een API niet meer druk te maken over welke hardware er in een systeem zit. Hij schrijft zijn hele programma met aansturingen aan de API (dus geen rechtstreekse hardware-aansturingen). De API zet deze aanroepen door middel van de HAL en de videokaart-drivers om in instructies voor de verschillende videokaarten. Indien er voor alle videokaarten drivers zijn voor een bepaalde API, dan hoeven programmeurs hun programmatuur alleen nog maar compatible te maken aan die bepaalde API.

Voor 3D software zijn er drie veel gebruikte API's:

Direct3D

Direct3D is de meest gebruikte 3D API en zit, samen met andere API's, in de Microsoft DirectX uitbreiding. DirectX is beschikbaar voor zowel Windows 9x als Windows 2000, zodat DirectX programmatuur meteen onder alle Windows versies werkt. Direct3D is voornamelijk voor spellen gemaakt en wordt door vrijwel alle videokaarten ondersteund. De meeste spellen ondersteunen ook standaard Direct3D en eventueel nog andere API's. 

OpenGL

OpenGL is oorspronkelijk gecreëerd door Silicon Graphics. OpenGL biedt zeer veel functionaliteit voor professionele 3D software en is niet platformafhankelijk. We komen de API dus niet alleen tegen bij professionele pakketten als 3D Studio Max, maar ook bij software die op veel verschillende computers moet werken. Een versie met wat minder mogelijkheden is MiniGL. Deze kan o.a. ook worden gebruikt voor computerspellen. De Quake-serie zijn wel de meest gekende MiniGL-spellen. Sommige videokaarten ondersteunen volledig OpenGL (bijv. de nVidia Riva TNT2), terwijl sommige alleen de MiniGL instructies kunnen verwerken (bijv. Voodoo3). Een driver voor volledig OpenGL wordt ICD (Installable Client Driver) genaamd, terwijl een driver voor MiniGL MCD (Mini Client Driver) wordt genoemd.

Glide

Glide is de eigen 3D API van 3dfx, de makers van de Voodoo videokaarten. Glide is ontstaan in het Voodoo 1 tijdperk, toen 3dfx eigenlijk nog als enige betaalbare 3D kaarten had op de computermarkt. Door het grote succes van Direct3D, wat ook met videokaarten van alle andere fabrikanten werkt, wordt Glide de laatste tijd steeds minder gebruikt. Als er nog spellen zijn die echt Glide ondersteunen, is dat voornamelijk als toevoeging op Direct3D en/of OpenGL.

0