In het eerste deel, waar we dieper ingaan op het maken van 3D-games, zullen we ons volledig concentreren op de bovenste fase van het proces. Dat betekent dat we onze wiskundeboeken moeten slepen, lineaire algebra, matrices en trigonometrie moeten poetsen - oh ja!

We laten zien hoe 3D-modellen worden getransformeerd en hoe lichtbronnen worden berekend. De verschillen tussen hoek- en geometrie-shaders worden grondig onderzocht en je zult zien waar de mozaïekpatroon past. Om de uitleg te vergemakkelijken, gebruiken we diagrammen en codevoorbeelden om te laten zien hoe wiskunde en getallen in een spel worden verwerkt. Als u hier nog niet klaar voor bent, hoeft u zich geen zorgen te maken - u kunt aan de slag. 3D-spelweergave 101. Als het echter eenmaal is ingesteld, lees dan verder voor onze eerste blik in de 3D-grafische wereld.

Wat is het doel?

In de wereld van de wiskunde is een punt gewoon een positie binnen een geometrisch veld. Er is niets kleiner dan een punt omdat het geen grootte heeft, dus ze kunnen worden gebruikt om duidelijk te definiëren waar objecten zoals lijnen, vlakken en volumes beginnen en eindigen.




Voor 3D-afbeeldingen is deze informatie cruciaal om te bepalen hoe alles eruit zal zien, aangezien alles wat wordt weergegeven een lijn, vlak, enz. Is. Verzameling. De onderstaande afbeelding is een screenshot van de 2015-release van Bethesda. Fallout 4:




Het kan een beetje moeilijk zijn om te zien dat dit slechts een grote stapel punten en lijnen is, dus we laten u zien hoe dezelfde scène eruitziet in de modus 'draadframe'. De 3D-rendering-engine slaat de texturen en effecten die in de pixelfase zijn gemaakt over en tekent niets anders dan gekleurde lijnen die de punten verbinden.







Alles ziet er nu heel anders uit, maar we kunnen verschillende objecten, de omgeving en alle lijnen zien die samenkomen om de achtergrond te creëren. Sommige zijn slechts een handvol lijnen, zoals rotsen op de voorgrond, terwijl andere genoeg lijnen hebben om er solide uit te zien.

Elk punt aan het begin en einde van elke regel is met veel wiskunde doorgewerkt. Sommige van deze berekeningen zijn erg snel en gemakkelijk; andere zijn veel moeilijker. Er zijn aanzienlijke prestatieverbeteringen door samen te werken aan groepen punten, vooral in een driehoekige vorm, dus laten we deze eens nader bekijken.




Wat is er nodig voor een driehoek?

Naam driehoek het vertelt ons dat de vorm 3 interne hoeken heeft; Hiervoor hebben we 3 hoeken en 3 lijnen nodig die de hoeken verbinden. Juiste naam van de hoek heuvel (hoekpunten zijn het meervoud) en elk wordt gedefinieerd door een punt. Omdat we zijn gebaseerd op een 3D geometrische wereld, Cartesisch coördinatenstelsel voor punten. Dit wordt meestal samen geschreven als 3 waarden, bijvoorbeeld (1, 8, -3) of meer in het algemeen (X ve Z).

Vanaf hier kunnen we nog twee hoekpunten toevoegen om een ​​driehoek te krijgen:




Merk op dat de getoonde lijnen niet echt nodig zijn - we kunnen alleen punten hebben en we kunnen het systeem vertellen dat deze 3 hoekpunten een driehoek vormen. Alle vertexgegevens worden opgeslagen in een aaneengesloten geheugenblok genaamd a hoek bumper; Informatie over de vorm die ze zullen maken, wordt rechtstreeks gecodeerd in het weergaveprogramma of opgeslagen in een ander geheugenblok. directory buffer.

In het eerste geval worden verschillende vormen genoemd die vanuit de hoeken kunnen worden gevormd primitief Direct3D presenteert rooster, strips en fans in punt-, lijn- en driehoekvorm. Als ze correct worden gebruikt, helpen driehoekige strepen de prestaties te verbeteren door hoeken te gebruiken voor meerdere driehoeken. In het onderstaande voorbeeld kunnen we zien dat er slechts 4 hoeken nodig zijn om 2 driehoeken samen te voegen - als ze gescheiden waren, zouden we 6 hoekpunten nodig hebben.

Als u een grotere verzameling hoeken wilt bedekken, bijv. een in-game NPC-model, dan een - dit is een ander geheugenblok, maar bestaat uit meerdere buffers (vertex, index, enz.) en textuurbronnen voor het model. Microsoft biedt een korte inleiding tot deze buffertoepassingen. online documenten bron.

Laten we ons voorlopig concentreren op wat er met deze hoeken in een 3D-game wordt gedaan, elke keer dat er een nieuw frame wordt gemaakt (als je niet zeker weet wat dat betekent, doe dan een snelle veegbeweging) render 101). Simpel gezegd, een of twee dingen worden met hen gedaan:

  • Verplaats het hoekpunt naar een nieuwe locatie
  • Verander de kleur van de hoek

Klaar voor wat wiskunde? Goed! Omdat dat is hoe het wordt gedaan.

Voer de vector in

Stel je voor dat er een driehoek op het scherm staat en je drukt op een knop om deze naar links te verplaatsen. Van nature (X ve Z) de nummers van elk hoekpunt variëren dienovereenkomstig en dat zijn ze ook; maar, Hoe Dit lijkt misschien een beetje ongebruikelijk. De overgrote meerderheid van 3D grafische weergavesystemen, in plaats van de coördinaten te wijzigen, gebruikt een specifiek wiskundig hulpmiddel om de klus te klaren: vectoren.

Een vector kan worden gezien als een pijl die naar een specifieke plaats in de ruimte wijst en kan elke gewenste lengte hebben. Hoeken worden op deze manier beschreven met behulp van vectoren op basis van cartesiaanse coördinaten:

Merk op hoe de blauwe pijl begint op een locatie (in dit geval Oorsprong) en strekt zich uit tot de top. We gebruikten wat heette column notatie om deze vector te beschrijven roeien notatie werkt ook. U zult ook merken dat er nog een extra waarde is - meestal is het 4e getal met w component en wordt gebruikt om aan te geven of de vector wordt gebruikt om de positie van een hoekpunt ( vector positie) of een algemeen aspect (a nacht vector). In het laatste geval ziet het er als volgt uit:

Deze vector wijst in dezelfde richting en heeft dezelfde lengte als de vorige positievector, dus (X ve Z) waarden zullen hetzelfde zijn; Maar w-componentvectoren zijn nul in plaats van 1. Het gebruik van richtingsvectoren zal later in dit artikel worden verduidelijkt, maar laten we nu eens kijken naar het feit dat alle hoekpunten in de 3D-scène op deze manier worden gedefinieerd. Waarom? Omdat het met dit formaat veel gemakkelijker wordt om ze te verplaatsen.

Wiskunde, wiskunde en meer wiskunde

Onthoud dat we een basisdriehoek hebben en deze naar links willen verplaatsen. Elk hoekpunt wordt gedefinieerd door een positievector, dus we moeten de 'bewegende wiskunde' ( conversies) moet aan deze vectoren werken. Voer het volgende voertuig in: serie (of moeder voor een van deze). Dit is een reeks waarden geschreven als rijen en kolommen, een beetje zoals een Excel-spreadsheet.

Voor elk type transformatie dat we willen doen, is er een bijbehorende matrix die erbij hoort, en het is gewoon het geval van het vermenigvuldigen van de transformatiematrix en de positievector met elkaar. We gaan niet in op de specifieke details van hoe en waarom dit gebeurt, maar we kunnen zien hoe het eruit ziet.

Verplaats hoekpunt in 3D-ruimte vertaling en de vereiste berekening is:

x0enzovoort. waarden vertegenwoordigen de oorspronkelijke coördinaten van het hoekpunt; delta-x De waarden geven aan hoeveel de piek moet bewegen. Matrix-vector berekening resulteert in het simpelweg optellen van de twee bij elkaar ( w de component blijft onaangeroerd, dus het uiteindelijke antwoord is nog steeds een positievector).

Naast het verplaatsen van dingen, willen we misschien de driehoek roteren of schalen naar een groter of kleiner formaat - er zijn transformaties voor beide.

WebGL-aangedreven grafische tool Website voor realtime weergave om deze berekeningen op een hele figuur te visualiseren. Laten we beginnen met een balk op een standaardlocatie:

In deze online tool verwijst het modelpunt naar de positievector, de aardematrix is ​​de transformatiematrix en het aarde-ruimtepunt is de positievector voor het getransformeerde hoekpunt.

Laten we nu verschillende transformaties toepassen op de balk:

In de afbeelding hierboven, de figuur vertaling 5 eenheden in elke richting. We kunnen deze waarden zien in de middelste grote matrix, de laatste kolom. De oorspronkelijke positievector (4, 5, 3, 1) blijft zoals het hoort, maar het getransformeerde hoekpunt wordt nu vertaald als (9, 10, 8, 1).

Bij deze transformatie werd alles dubbel geschaald: de balk heeft nu twee keer zo lange zijden. Het laatste voorbeeld om naar te kijken is een keerpunt:

De balk wordt onder een hoek van 45 ° gedraaid, maar de matrix hun ve cosinus hoek het. Een snelle controle van elke wetenschappelijke rekenmachine zonder (45 °) = 0,7071 ... rondt af op de weergegeven waarde 0,71. We krijgen hetzelfde antwoord cosinus waarde.

Matrices en vectoren hoeven niet te worden gebruikt; een veelgebruikt alternatief voor het omgaan met bijzonder complexe rotaties, complexe getallen en kuaterniyonlar. Deze wiskunde is een grote stap vooruit ten opzichte van vectoren, dus we zullen transformaties doorlopen.

De kracht van de Peak Shader

In dit stadium moeten we bedenken dat al deze problemen moeten worden opgelost door de mensen die de buildcode programmeren. Als een game-ontwikkelaar een engine van derden gebruikt (zoals Unity of Unreal), is dit al voor hem gedaan, maar iedereen die zijn eigen berekeningen helemaal opnieuw maakt, moet uitzoeken welke hoeken ze moeten doen.

Dus hoe ziet dit eruit in termen van code?

We gebruiken voorbeelden van de uitstekende website om hierbij te helpen. Braynzar Soft. Het is een geweldige plek om de basisprincipes en meer geavanceerde dingen te leren als je zelf wilt beginnen met 3D-programmeren.

Dit voorbeeld is de 'alles-in-één'-transformatie. Creëert de corresponderende transformatiematrices op basis van een toetsenbordinvoer en past deze vervolgens in één bewerking toe op de oorspronkelijke positievector. Onthoud dat dit altijd in een bepaalde volgorde gebeurt (schaal - roteren - omdraaien) omdat elke andere manier het resultaat volledig zal bederven.

Dit soort codeblokken worden genoemd heuvel shaders en ze kunnen sterk variëren, afhankelijk van wat ze doen, hun grootte en complexiteit. Het bovenstaande voorbeeld is net zo eenvoudig en onmiskenbaar als ze komen enkel en alleen een arcering omdat het geen gebruik maakt van de volledig programmeerbare aard van de shaders. Een complexere reeks shaders kan deze in 3D-ruimte transformeren, berekenen hoe de scène op de camera zal verschijnen en die gegevens vervolgens overbrengen naar de volgende fase in het renderingproces. We zullen meer voorbeelden bekijken terwijl we de volgorde van het trimmen van hoeken doorlopen.

Ze kunnen natuurlijk voor veel meer worden gebruikt, en onthoud dat elke keer dat u een spel speelt dat in 3D wordt gespeeld, alle bewegingen die u kunt zien, worden uitgevoerd door de grafische processor, volgens de instructies in de hoek-shaders.

Dit was echter niet altijd het geval. Terugkerend naar het midden van de jaren negentig, waren grafische kaarten uit die tijd niet in staat om zelf met hoeken en primitieven om te gaan, allemaal volledig op de CPU.

Een van de eerste processors die speciale hardwareversnelling biedt voor dit type verwerking De originele GeForce van Nvidia werd uitgebracht in 2000 en deze eigenschap is getagd Hardwareconversie en verlichting (of in het kort Hardware TnL). De bewerkingen die deze hardware aankon, waren erg strikt en constant in termen van commando's, maar dat veranderde snel toen er nieuwe grafische chips werden uitgebracht. Tegenwoordig is er geen afzonderlijke hardware voor hoekverwerking en kunnen dezelfde eenheden alles aan: punten, primitieven, pixels, texturen, enz.

Praten over verlichtingmoet worden opgemerkt dat alles wat we zien natuurlijk wordt veroorzaakt door licht, dus laten we eens kijken hoe dit kan worden aangepakt in het piekstadium. Om dit te doen, gebruiken we iets dat we eerder in dit artikel hebben genoemd.

Licht cameramotor!

Stel je deze scène voor: de acteur staat in een donkere kamer die aan de rechterkant wordt verlicht door een enkele lichtbron. In het midden van de kamer staat een gigantische drijvende dikke theepot. Ok, we hebben waarschijnlijk een beetje hulp nodig om dit zo te visualiseren Website voor realtime weergave, om zoiets als dit in actie te zien:

Merk nu op dat dit object een verzameling rechte driehoeken is die aan elkaar zijn genaaid; Dit betekent dat het vlak van elke driehoek in een bepaalde richting wijst. Sommigen kijken naar de camera, anderen de andere kant op, terwijl anderen scheef staan. Het licht van de bron raakt elk vlak en weerkaatst onder een bepaalde hoek.

Afhankelijk van waar het licht naartoe gaat, zullen de kleur en helderheid van het vlak veranderen, en deze moeten allemaal worden berekend en berekend om ervoor te zorgen dat de kleur van het object correct lijkt.

Om te beginnen moeten we weten in welke richting het vliegtuig wijst en hiervoor normale vector vliegtuig. Dit is een andere pijl, maar in tegenstelling tot de positievector doet de grootte er niet toe (in feite worden ze altijd geschaald na berekening, dus ze zijn precies 1 eenheid lang) en altijd dik (rechte hoek) vliegtuig.

De normaal van het vlak van elke driehoek, het vectorproduct van de twee richtingsvectoren (p ve q Hierboven weergegeven) vormen de zijden van de driehoek. Het is eigenlijk beter om voor elk hoekpunt te werken en niet voor elke driehoek, maar aangezien het altijd meer zal zijn dan het vorige in vergelijking met de laatste, is het sneller om het alleen voor driehoeken te doen.

Nadat je de normaal van een oppervlak hebt bereikt, kun je rekening gaan houden met de lichtbron en camera. Lampen kunnen van verschillende typen zijn in 3D-weergave, maar alleen voor de toepassing van dit artikel directioneel lichten, bijv. een spotlight. Net als het vlak van een driehoek, zullen de schijnwerper en de camera in een bepaalde richting wijzen, misschien zoiets als dit:

De vector van licht en de normaalvector kunnen worden gebruikt om de hoek te vinden waaronder het licht het oppervlak raakt (gebruikmakend van de relatie tussen het puntproduct van de vectoren en het product van hun afmetingen). De hoekpunten van de driehoek bevatten aanvullende informatie over hun kleuren en materialen - in het laatste geval legt het uit wat er met het licht gebeurt wanneer het het oppervlak raakt.

Een glad, metalen oppervlak reflecteert bijna al het binnenkomende licht onder de hoek waar het vandaan komt en zal nauwelijks van kleur veranderen. Een ruw, dof materiaal daarentegen verstrooit licht op een minder voorspelbare manier en verandert subtiel van kleur. Om hiermee rekening te houden, moeten hoekpunten aanvullende waarden hebben:

  • Originele kleur basis
  • Ambient material property - een waarde die bepaalt hoeveel 'achtergrondlicht' het hoekpunt kan absorberen en reflecteren
  • Diffuse materiaaleigenschap - een andere waarde, maar deze keer laat zien hoe grof de piek is, dit beïnvloedt hoeveel het verstrooide licht wordt geabsorbeerd en gereflecteerd
  • Speculatieve materiaaleigenschappen - twee waarden die een maatstaf geven voor hoe 'helder' de piek is

Verschillende verlichtingsmodellen gebruiken verschillende wiskundige formules om ze allemaal te groeperen, en de berekening produceert een vector voor het invallende licht. Dit wordt gecombineerd met de vector van de camera, het algemene uiterlijk van de driehoek kan worden bepaald.

We hebben hier de fijnere details doorgenomen en om een ​​betere reden: pak een studieboek over 3D-rendering en je zult alle hoofdstukken zien die aan dit ene proces zijn gewijd. Moderne games voeren echter de meeste lichtberekeningen en materiaaleffecten vaak uit in de pixelcomputerfase, dus we zullen dit onderwerp in een ander artikel opnieuw bespreken.

Alles wat we tot nu toe hebben behandeld, is gedaan met behulp van hill shaders, en het lijkt misschien alsof er bijna niets is dat ze niet kunnen doen; Helaas is er. Hoekshaders kunnen geen nieuwe hoekpunten maken en elke arcering moet op elk hoekpunt werken. Het zou handig zijn geweest als er een manier was om wat code te gebruiken om meer driehoeken te maken, een manier om een ​​arcering te laten werken tussen wat we al hebben (om de visuele kwaliteit te verbeteren) en bovenal primitief (om dingen te versnellen). tot). Met moderne grafische processors, Kan Doe dit!

Alsjeblieft meneer, ik wil wat meer (driehoeken)

De nieuwste grafische chips zijn buitengewoon krachtig en kunnen elke seconde miljoenen matrix-vectorberekeningen uitvoeren; ze kunnen in een mum van tijd gemakkelijk een grote stapel hoeken passeren. Aan de andere kant is het maken van zeer gedetailleerde modellen erg tijdrovend, en als het model een beetje buiten beeld raakt, gaan al die extra details verloren.

Wat we nodig hebben is een manier om de processor te vertellen dat hij het moet splitsen in een grotere primitief, een verzameling kleinere driehoeken die allemaal met elkaar zijn verbonden binnen de oorspronkelijke grotere, zoals de enkele rechte driehoek waar we naar kijken. De naam van dit proces: tesselation en grafische chips hebben dit al geruime tijd kunnen doen; Wat in de loop der jaren is verbeterd, is het aantal controleprogrammeurs over de operatie.

Om dit in actie te zien, gebruiken we: Unigine's Paradise benchmark-tool, omdat het ons in staat stelt om verschillende hoeveelheden mozaïekpatroon toe te passen op de specifieke modellen die in de test worden gebruikt.

Laten we om te beginnen een plaats innemen in de benchmark en deze onderzoeken zonder dat het mozaïek is aangebracht. Pas op dat de kasseien op de vloer er te nep uitzien - de gebruikte textuur is effectief maar ziet er niet goed uit. Laten we wat mozaïek op de scène toepassen; Unigine past de motor alleen op bepaalde onderdelen toe, maar het verschil is dramatisch.

De vloer, de bouwranden en de deur zien er nu veel realistischer uit. Als we het proces opnieuw uitvoeren, kunnen we zien hoe dit wordt bereikt, maar deze keer met de randen van de primitieven gemarkeerd (draadmodelmodus):

We kunnen duidelijk zien waarom de vloer er zo vreemd uitziet - helemaal vlak! De deur loopt ook gelijk met de muren en de gebouwranden zijn niets meer dan simpele kubussen.

In Direct3D kunnen primitieve elementen worden opgesplitst in een kleinere groep onderdelen ( onderste compartiment) Door een reeks van 3 fasen uit te voeren. Ten eerste, programmeurs body shader - in feite is deze code een geometrie patch. Stel je dit voor als een kaart die de processor vertelt waar de nieuwe principes en lijnen binnen de oorspronkelijke primitief zullen verschijnen.

Vervolgens past de tesselator-eenheid in de grafische processor de patch toe op het principe. Tenslotte, gebiedshader berekent de posities van alle nieuwe hoeken wordt uitgevoerd. Deze gegevens kunnen indien nodig worden teruggevoerd naar de vertexbuffer, zodat belichtingsberekeningen opnieuw kunnen worden uitgevoerd, maar dit keer met betere resultaten.

Dus hoe ziet dit eruit? Laten we de wireframe-versie van de mozaïekscène starten:

De waarheid is dat we het niveau van mozaïekpatroon op een behoorlijk extreem niveau hebben ingesteld om het proces te helpen verklaren. Het is net zo goed als moderne grafische chips, het is niet iets dat je in elk spel zou willen doen - neem bijvoorbeeld de lantaarnpaal bij de deur.

In de afbeeldingen zonder draadframe wordt u gedwongen om het verschil in deze afstand te beschrijven, en u kunt dit vlakverdelingsniveau zien samenklonteren in te veel driehoeken, waarvan sommige moeilijk te zien zijn. Toch wordt het correct gebruikt, en deze functie van het renderen van hoeken kan resulteren in een aantal geweldige visuele effecten, vooral bij het simuleren van botsingen met een zacht lichaam.

In de afbeeldingen zonder draadframe wordt u gedwongen om het verschil in deze afstand te beschrijven, en u kunt dit vlakverdelingsniveau zien samenklonteren in te veel driehoeken, waarvan sommige moeilijk te zien zijn. Laten we eens kijken hoe dit eruit zou kunnen zien in termen van Direct3D-code; Om dit te doen, zullen we een voorbeeld van een andere geweldige website gebruiken. RasterTek.

Hier is een enkele groene driehoek betegeld in veel meer babydriehoeken.

Bekroning gebeurt met 3 afzonderlijke shaders (zie fig. code voorbeeld): een hoekpuntshader om de driehoek klaar te maken voor triangulatie, een bodyshader om de patch te maken en een domeincader om nieuwe hoeken weer te geven. Het resultaat is heel eenvoudig, maar het Unigine-voorbeeld benadrukt de potentiële voordelen en gevaren van het overal gebruiken van mozaïeken. Toch wordt het correct gebruikt, en deze functie van het renderen van hoeken kan resulteren in een aantal geweldige visuele effecten, vooral bij het simuleren van botsingen met een zacht lichaam.

U kunt het aan, kapitein!

Herinner je je hoekshaders nog en wordt je altijd in elke hoek van de scène gebruikt? Het is niet moeilijk in te zien hoe mozaïekpatroon dit een echt probleem kan maken. En er zijn veel visuele effecten die je met meerdere versies van dezelfde primitief wilt aanpakken, maar in eerste instantie niet een groot aantal wilt creëren; haar, vacht, gras en exploderende deeltjes zijn hier goede voorbeelden van.

Gelukkig is er alleen voor dit soort dingen een andere arcering beschikbaar - geometrie-arcering. Het is een meer beperkende versie van de hoekpuntshader, maar kan worden toegepast op een heel principe en in combinatie met vlakvulling geeft het programmeurs meer controle over grote hoekpuntgroepen.

Direct3D maakt, net als alle moderne grafische API's, een breed scala aan berekeningen op hoekpunten mogelijk. De definitieve gegevens kunnen naar de volgende fase van het aanmaakproces worden gestuurd (pixelatie) of teruggevoerd naar de geheugenpool, zodat deze kan worden herwerkt of gelezen door de CPU voor andere doeleinden. Dit kan worden gedaan als een datastroom, zoals Microsoft benadrukt Direct3D-documentatie:

stroomuitgang de scène is vooral handig voor effecten met veel deeltjes overal, omdat het alle principes (niet individuele hoeken) kan terugvoeren naar de rendering-loop. Dezelfde truc kan worden gewijzigd of dynamisch hoekbumper, maar het is beter om de invoerbumpers stabiel te houden omdat er een prestatiehit is als ze moeten 'openen' om te veranderen.

Hoekweergave is een cruciaal onderdeel van de weergave, omdat het bepaalt hoe de scène wordt gerangschikt vanuit het perspectief van de camera. Moderne games kunnen miljoenen driehoeken gebruiken om hun werelden te creëren, en elk van deze hoeken zal op de een of andere manier worden getransformeerd en verbrand.

Het afhandelen van al deze wiskunde en gegevens lijkt misschien een logistieke nachtmerrie, maar grafische processors (GPU's) en API's zijn ontworpen met dit alles in gedachten - ze laten een naadloos draaiende fabriek zien die een item door een reeks productiefasen afvuurt en dat goed doet. je zal het begrijpen.

Ervaren 3D-spelcreatie programmeurs hebben een uitgebreide basis in geavanceerde wiskunde en natuurkunde; Ze gebruiken elke truc en tool in de handel om transacties te optimaliseren en de piekverwerkingsfase terug te brengen tot slechts enkele milliseconden. En dat is nog maar het begin van het maken van een 3D-frame - dan de rasterstap, en dan is er een behoorlijk ingewikkelde pixel- en textuurweergave voordat het ergens in de buurt van je monitor komt.

Nu je het einde van dit artikel hebt bereikt, hopen we dat je een dieper inzicht hebt in de reis van een hoekpunt wanneer deze is bewerkt voor een 3D-frame. We hebben niet alles behandeld (het is een muazzam artikel!), en we weten zeker dat je veel vragen zult hebben over vectoren, matrices, lichten en primitieve elementen. Zet ze onderweg neer in het opmerkingengedeelte en we zullen ons best doen om ze allemaal te beantwoorden.

Lees ook