Was ist Rampenbeschattung oder Beleuchtung und wie funktioniert es? Ist es anders als Toon Shading oder ist es das gleiche Konzept? Wie wird die Spekularität für Rampenschattierung anders berechnet als für Blinn-Phong oder Lambert?
Bei der herkömmlichen Blinn / Phong-Schattierung berechnen Sie den diffusen Term für ein Pixel, indem Sie den Cosinus des Winkels zwischen der Normalen an der Oberfläche und der Richtung des Lichts messen. In diesem Fall würde ein einfacher Shader ungefähr so aussehen:
float DiffuseCoeff(in float3 pos, in float3 normal, in float3 lightPos) {
float3 lightDir = lightPos - pos;
lightDir.normalize();
return max(0.0, Dot(lightDir, normal));
}
Bei der Rampenschattierung besteht die Idee darin, den diffusen Koeffizienten durch eine 1D-Nachschlagetextur zu modulieren. Abhängig davon, was Sie in diese Textur einfügen, können Sie verschiedene Effekte erzeugen. Daher lautet unsere Shader-Funktion zur Berechnung des diffusen Koeffizienten:
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);
}
Wenn wir beispielsweise einen Cell Shader implementieren möchten, können wir eine Rampentextur generieren, die eine Sprungfunktion emuliert:
Mit derselben Idee können Sie auch unterschiedliche Effekte für die spiegelnde Beleuchtung erzeugen. "Rampenschattierung" bezieht sich eigentlich nur auf die Idee, einen Schattierungswert durch eine Textur zu modulieren.
BEARBEITEN : Team Fortress 2 verwendet beim Rendern einen Ramp-Shader. Sie können die Details in diesem Artikel überprüfen:
http://www.valvesoftware.com/publications/2007/NPAR07_IllustrativeRenderingInTeamFortress2.pdf
Schauen Sie sich unter Abschnitt 5 den Unterabschnitt "Diffuse Warping Function" an.