Nella tradizionale sfumatura Blinn / Phong, si calcola il termine diffuso per un pixel misurando il coseno dell'angolo tra il normale in superficie e la direzione della luce. Quindi, in questo caso, un semplice shader sarebbe simile a questo:
float DiffuseCoeff(in float3 pos, in float3 normal, in float3 lightPos) {
float3 lightDir = lightPos - pos;
lightDir.normalize();
return max(0.0, Dot(lightDir, normal));
}
Nell'ombreggiatura della rampa, l'idea è quella di modulare il coefficiente diffuso mediante una trama di ricerca 1D. A seconda di ciò che metti in questa trama puoi generare effetti diversi. Quindi, la nostra funzione shader per calcolare il coefficiente diffuso diventa:
texture1D rampTex;
float DiffuseCoeff(in float3 pos, in float3 normal, in float3 lightPos) {
float3 lightDir = lightPos - pos;
lightDir.normalize();
// Map value from [-1, 1] to [0, 1]
float rampCoord = Dot(lightDir, normal) * 0.5 + 0.5;
return tex1D(rampTex, rampCoord);
}
Ad esempio, se volessimo implementare uno shader cellulare, ciò che potremmo fare è generare una trama a rampa che emuli una funzione a gradino:
Puoi usare la stessa idea per generare effetti diversi anche per l'illuminazione speculare. L'ombreggiatura "Rampa" si riferisce in realtà solo all'idea di modulare un valore di ombreggiatura da una trama.
EDIT : Team Fortress 2 utilizza uno shader di rampa per il rendering. Puoi controllare i dettagli in questo documento:
http://www.valvesoftware.com/publications/2007/NPAR07_IllustrativeRenderingInTeamFortress2.pdf
Guarda nella sezione 5, la sottosezione intitolata "Funzione di deformazione diffusa"