De zes stappen van het 3D rendering proces (vervolg)
4. Lightning
Zodra we van alle driehoeken binnen een 3D frame de precieze posities hebben worden in de (overigens optionele) stap vier de lichteffecten berekend. Een 3D scène kan meerdere lichtbronnen bevatten en in deze fase wordt voor ieder hoekpunt berekend hoeveel impact de verschillende lichtbronnen daar nog op hebben.
Ook lichttechnieken komen neer op veel matrix berekeningen. Omgekeerd evenredig met de afstand tussen een lichtbron en een hoekpunt van een driehoek, zal de lichtbron een bepaalde impact uitoefenen op dit hoekpunt. Het is dus zaak al deze afstanden te berekenen. Aangezien een scène meer dan één lichtbron kan bevatten, moet vanuit elke lichtbron de afstand berekend worden naar elk hoekpunt van elke driehoek binnen de 3D scène. Het aantal benodigde berekeningen is dus recht evenredig met zowel het aantal lichtbronnen als het aantal driehoeken binnen een 3D scène.
Voor de liefhebbers staat in onderstaande formule weer de benodigde berekening voor de afstand tussen twee punten in een 3D omgeving:

Als een lichtbron zich bevindt op de coördinaten (x1, y1, z1) en het object op de coördinaten (x2, y2, z2), vinden we door het van elkaar aftrekken van beide vectoren de verbindingsvector (u, v, w). De lengte (d) van deze vector, en dus de onderlinge afstand van de lichtbron en het object, vinden we dan door de stelling van Pythagoras los te laten op de verbindingsvector.
Ook hier dus weer een enorme hoeveelheid rekenwerk, vooral ook omdat kwadrateren en worteltrekken niet de allermakkelijkste berekeningen voor processoren zijn.
5. Triangle Setup
In deze een na laatste stap wordt er voor het eerst met pixels (afzonderlijke punten op het scherm) gerekend. Zoals we ondertussen weten, ontvangt deze fase als input van iedere driehoek de positie van ieder hoekpunt (hoogte, breedte, diepte). De Triangle Setup engine zal nu eerst berekenen welke driehoeken niet de moeite waard zijn om verder te verwerken, aangezien ze toch niet zichtbaar zijn. Als we bijvoorbeeld een kubus hebben gemodelleerd zijn er altijd maar maximaal drie vlakken zichtbaar: de andere drie vlakken hoeven dus niet verder verwerkt te worden. Na dit zogenaamde "Backface Culling" (het weggooien van de achterkanten) zorgt de Triangle Setup ervoor dat alle driehoeken gesorteerd worden op diepte: de driehoeken die het verst weg zijn worden als eerste verwerkt. De belangrijkste taak van de Triangle Setup engine is om daarna precies te berekenen welke pixels op het scherm bij welke driehoeken gaan horen. Pixel voor pixel worden de driehoeken nu doorgegeven naar de volgende fase. Van iedere pixel wordt dus niet alleen doorgegeven waar deze zich op het scherm bevindt, maar ook wat de relatieve diepte is. Deze diepte voor iedere pixel wordt opgeslagen in de zogenaamde Z-Buffer. Het nut van een Z-Buffer is heel duidelijk: als twee driehoeken elkaar half overlappen zal een pixel op positie (x, y) twee keer voor kunnen komen. D.m.v. de Z-Buffer kan men achterhalen dat de ene pixel echter voor de andere staat en kan de achterste pixel vergeten worden. Bij huidige videokaarten is de Z-Buffer ofwel 16-bits, ofwel 24-bits ofwel 32-bits breed. Dit houdt in dat er dus ofwel 65.536 ofwel 16.777.216 ofwel 4.294.967.296 verschillende dieptes zijn. Uiteraard is het zo dat hoe nauwkeuriger de dieptes kunnen worden aangegeven, des te kleiner de kans op fouten in de verwerking is.
6. Pixel Rendering Engine
De laatste stap in het proces, de Pixel Rendering Engine, gaat nu per pixel berekenen welke kleur er uiteindelijk vertoond gaat worden. Ook dit gaat met een stappen plan. Eerst wordt de pixel ingekleurd, ofwel d.m.v. flat of Gouraud shading, ofwel d.m.v. texturing. Nadat de voorlopige kleur nu bekend is zal de Pixel Rendering Engine nog een groot aantal (optionele) effecten berekenen: hier komen zaken als belichtings effecten en bijvoorbeeld fog effecten om de hoek kijken. Zodra alle pixels verwerkt zijn, is het frame af en kan het vertoond worden.
Om lelijke overgangen tussen verschillende frames te voorkomen, werkt een videokaart met zogenaamde front en back buffers. In beide buffers kan een gehele afbeelding worden opgeslagen. In de front buffer staat altijd het frame dat op dit moment te zien is op het scherm. In de back buffer wordt door de Pixel Rendering Engine het volgende frame opgebouwd. Zodra het volgende frame voltooid is, wordt de inhoud van de back buffer gekopieerd naar de front buffer (en dus vertoond op het scherm) en wordt in de back buffer begonnen aan het volgende frame. Nog mooier is het als i.p.v. dat "double buffering" systeem "triple buffering" wordt toegepast. Er zijn dan twee back buffers, zodat de videokaart altijd één frame reserve heeft.
Voor de liefhebbers nog even een stukje rekenwerk:stel een videokaart werkt met Triple Buffering en heeft tevens een 24-bit Z-Buffer, zoals we die bij stap 3 besproken hebben. De gebruikte resolutie is 1024x768 bij 32-bit kleurdiepte. We kunnen nu met de volgende formule het benodigde geheugen uitrekenen:
( Aantal Buffers * x-resolutie * y-resolutie * kleur-bit-diepte/8 )
+ ( x-resolutie * y-resolutie * Z-buffer-bit-diepte/8 )
In ons voorbeeld komen we dan op (3x1024x768x4)+(1024x768x3) = 11796480 bytes = 11,25 MB! Als je dan ook nog bedenkt dat de textures voor 3d objecten ook zoveel mogelijk in het hoofdgeheugen worden opgeslagen is het logisch dat nieuwe generatie videokaarten al 32 MB geheugen on-board hebben!
De "/8" is om het resultaat in bytes te krijgen, en niet in bits. (1 Byte = 8 Bit). De Z-Buffer informatie wordt alleen maar onthouden voor de Back Buffer, aangezien in de Front Buffer(s) al voltooide 3D-scène staan. Z-Buffer informatie is daar dus niet meer van belang en wordt dus weggegooid.