Shaders zijn kleine programma's die op je GPU worden uitgevoerd als onderdeel van het renderproces. Ze regelen alles, van het transformeren van de geometrie van 3D-modellen tot het toepassen van texturen, belichting, schaduwen en nabewerkingseffecten. Ze zijn van fundamenteel belang voor moderne games en mede verantwoordelijk voor het indrukwekkende uiterlijk van deze games.
Dit is echter niet altijd zo geweest. Vroege grafische kaarten waren afhankelijk van hardware met vaste functies, met afzonderlijke eenheden voor taken zoals texturering en belichting. Hoewel deze eenheden voor hun tijd krachtig waren, waren ze ook rigide. Naarmate games complexer en visueel ambitieuzer werden, beperkte vaste hardware zowel de visuele effecten als de creatieve vrijheid. Programmeerbare shaders hebben die beperkingen weggenomen.
De eerste veelgebruikte shaders waren pixel shaders. Deze bepalen de uiteindelijke kleur van elke pixel op het scherm en kunnen verlichtingsberekeningen, schaduwen, texturen, transparantie en nabewerkingseffecten zoals vervaging of cel shading verwerken. Kort daarna volgden vertex shaders, waarmee ontwikkelaars vertexgegevens zoals positie, kleur en textuurcoördinaten kunnen manipuleren voordat de geometrie wordt weergegeven.
Later kwamen geometrische shaders, die geometrie direct binnen de grafische pijplijn kunnen genereren en wijzigen. Hoewel ze tegenwoordig vanwege prestatiekosten niet veel worden gebruikt, maakten ze effecten mogelijk zoals procedurele geometrie en deeltjeseffecten. Tessellatieshaders bouwden voort op dit idee door geometrische details dynamisch te vergroten, waardoor oppervlakken er gladder uitzien zonder dat er meer modelgegevens hoeven te worden opgeslagen.
Meer recentelijk hebben moderne API's taak- en mesh-shaders geïntroduceerd. Deze vervangen delen van de traditionele vertex-, geometrie- en tessellatiefasen door een flexibeler systeem dat ontwikkelaars meer controle geeft over hoe geometrie wordt gegenereerd en verwerkt.
Ray tracing-shaders zijn de nieuwste toevoeging. Deze worden gebruikt voor effecten zoals reflecties, schaduwen en globale verlichting door de paden van lichtstralen door een scène te volgen. Ze worden ondersteund door DirectX Raytracing en Vulkan, en vereisen relatief moderne grafische kaarten om op een speelbaar prestatieniveau te kunnen draaien.
Als dat is wat shaders zijn, waarom kan het dan zo lang duren om ze vooraf te laden, en wat betekent vooraf laden eigenlijk?
De term is enigszins misleidend. In de praktijk betekent het vooraf laden van shaders het compileren en cachen van shaders in plaats van ze alleen maar te laden. Gameontwikkelaars kunnen shaders tijdens het spelen direct compileren, of ze van tevoren compileren voordat het spel begint.
Het compileren van shaders tijdens het spelen kan werken in eenvoudige gevallen, maar leidt vaak tot vertragingen en haperingen wanneer nieuwe effecten of gebieden worden aangetroffen. Als er veel shaders tegelijk moeten worden gecompileerd, kan de framerate sterk dalen. Daarom is deze aanpak zo duidelijk merkbaar in open-wereldgames. Overmatige on-the-fly compilatie is vaak een teken van slechte pc-optimalisatie.
Door shaders vooraf te laden, wordt dit probleem vermeden door ze vooraf te compileren en de resultaten in een cache op te slaan. Eenmaal gecompileerd, kunnen shaders direct tijdens het spelen worden hergebruikt, wat resulteert in soepelere prestaties. Het nadeel is dat je de eerste keer dat je het spel start, moet wachten tot de shaders zijn gecompileerd.
Dat wachten kan terugkeren na een grote game-update of updates van grafische stuurprogramma's, aangezien shader-binaries nauw verbonden zijn met zowel de gameversie als het GPU-stuurprogramma. Omdat grafische stuurprogramma's regelmatig worden bijgewerkt, wordt het opnieuw compileren van shaders een bekende frustratie voor pc-spelers.
Waarom kunnen ontwikkelaars niet gewoon voorgecompileerde shaders leveren? Op onze geliefde pc's is de hardware en driveromgeving simpelweg te divers. Shadercompilatie is afhankelijk van de GPU-architectuur, driverversie en grafische API, dus een gecompileerde shader die op het ene systeem werkt, werkt niet op een ander systeem. Consoles hebben dit probleem niet omdat het vaste platforms zijn, maar pc's zijn dat niet.
Dus de volgende keer dat je naar een scherm kijkt waarop een shader wordt voorgeladen, bedenk dan dat dit bedoeld is om haperingen te verminderen en de prestaties te verbeteren zodra je daadwerkelijk aan het spelen bent. Het is een kracht ten goede.
JOIN OUR OFFICIAL CORSAIR COMMUNITIES
Join our official CORSAIR Communities! Whether you're new or old to PC Building, have questions about our products, or want to chat the latest PC, tech, and gaming trends, our community is the place for you.