O que é sombreamento ou iluminação da rampa e como funciona? É diferente do toon shading ou é o mesmo conceito? Como a especularidade é calculada de maneira diferente para sombreamento na rampa versus blinn-phong ou lambert?
No sombreamento tradicional de Blinn / Phong, você calcula o termo difuso para um pixel medindo o cosseno do ângulo entre o normal na superfície e a direção da luz. Portanto, nesse caso, um simples sombreador se pareceria com isso:
float DiffuseCoeff(in float3 pos, in float3 normal, in float3 lightPos) {
float3 lightDir = lightPos - pos;
lightDir.normalize();
return max(0.0, Dot(lightDir, normal));
}
No sombreamento em rampa, a idéia é modular o coeficiente difuso por uma textura de pesquisa 1D. Dependendo do que você coloca nessa textura, você pode gerar efeitos diferentes. Portanto, nossa função de sombreador para calcular o coeficiente difuso se torna:
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);
}
Por exemplo, se quisermos implementar um sombreador de célula, o que poderíamos fazer é gerar uma textura de rampa que emula uma função de etapa:
Você pode usar a mesma idéia para gerar efeitos diferentes também para a iluminação especular. O sombreamento "rampa" realmente se refere apenas à idéia de modular um valor de sombreamento por uma textura.
EDIT : Team Fortress 2 usa um shader de rampa em sua renderização. Você pode conferir os detalhes neste documento:
http://www.valvesoftware.com/publications/2007/NPAR07_IllustrativeRenderingInTeamFortress2.pdf
Consulte a Seção 5, na subseção "Função de distorção difusa"