Pixel shader

Uit Wikipedia, de vrije encyclopedie

Een pixel shader is een stuk programmacode dat geavanceerde kleuring in rasterizers (waaronder huidige videokaarten) mogelijk maakt. Dit stuk programmacode wordt voor elke pixel die er getekend wordt uitgevoerd en heeft tot taak om de kleur van die pixel te berekenen. Het is verwant aan de vertex shader, dat een stuk programmacode is dat voor elke vertex uitgevoerd wordt.

Pixel shaders worden al sinds jaar en dag in niet-realtimerendering gebruikt en zijn dan meestal een plug-in voor 3D-pakketten zoals Maya en 3D Studio MAX, die gewoon in C of C++ geschreven kunnen worden. Ze worden immers uitgevoerd op de normale processor, dus alle functionaliteit van de processor is beschikbaar.

Sinds de DirectX 8 generatie videokaarten zijn pixel shaders ook voor realtimerendering beschikbaar. Er is op de videokaart een speciale programmeerbare processor aangebracht, die de pixel shader uitvoert. Deze processor heeft echter veel minder mogelijkheden dan een normale processor. Hij is specifiek toegespitst op het berekenen van de kleur van een pixel en heeft functionaliteit zoals het uitlezen van textures, de invalshoek van een lichtstraal berekenen (dp3) en de gebruikelijke rekenkundige instructies zoals optellen, aftrekken, vermenigvuldigen enz. De nieuwere versies, Shading Model 2.0 en Shading Model 3.0, hebben er steeds meer functionaliteit bijgekregen, zoals vertakking (wat programmalussen mogelijk maakt) en het uitlezen van textures met willekeurige coördinaten.

Pixel shaders kunnen geprogrammeerd worden in een assemblertaal, een taal die veel lijkt op hoe het in de hardware geïmplementeerd is. Moeilijk te programmeren, maar wel het meest efficiënt als je kijkt naar de performance. Een voorbeeld van een stukje pixel shader assembly:

ps_2_0

dcl_2d s0
dcl t0.xy

texld r1, t0, s0
mov oC0, r1

Pixel shaders kunnen ook geprogrammeerd worden in een taal van een hoger niveau, wat betekent dat je minder te maken hebt met hoe de hardware werkt en die voor mensen vaak duidelijker te lezen is. Een voorbeeld van zo'n taal is NVIDIA's Cg, (C for graphics). Een stukje Cg:

float4 brightLightMapDecal(float4 color : COLOR,
 float4 decalCoord : TEXCOORD0,
 float4 lightMapCoord : TEXCOORD1,
 uniform sampler2D decal,
 uniform sampler2D lightMap) : COLOR
{
 float4 d = tex2Dproj(decal, decalCoord);
 float4 lm = tex2Dproj(lightMap, lightMapCoord);
 return 2.0 * color * d * lm;
}