Dans l'ombrage Blinn / Phong traditionnel, vous calculez le terme diffus pour un pixel en mesurant le cosinus de l'angle entre la normale à la surface et la direction de la lumière. Donc, dans ce cas, un simple shader ressemblerait à ceci:
float DiffuseCoeff(in float3 pos, in float3 normal, in float3 lightPos) {
float3 lightDir = lightPos - pos;
lightDir.normalize();
return max(0.0, Dot(lightDir, normal));
}
En ombrage de rampe, l'idée est de moduler le coefficient diffus par une texture de recherche 1D. Selon ce que vous mettez dans cette texture, vous pouvez générer différents effets. Par conséquent, notre fonction de shader pour calculer le coefficient diffus devient:
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);
}
Par exemple, si nous voulions implémenter un shader de cellule, nous pourrions générer une texture de rampe qui émule une fonction de pas:
Vous pouvez également utiliser la même idée pour générer différents effets pour l'éclairage spéculaire. L'ombrage "rampe" fait référence uniquement à l'idée de moduler une valeur d'ombrage par une texture.
EDIT : Team Fortress 2 utilise un shader de rampe dans leur rendu. Vous pouvez consulter les détails dans cet article:
http://www.valvesoftware.com/publications/2007/NPAR07_IllustrativeRenderingInTeamFortress2.pdf
Regardez sous la section 5, la sous-section intitulée "Fonction de distorsion diffuse"