Co to jest cieniowanie lub oświetlenie i jak działa? Czy różni się od cieniowania tonicznego, czy jest to ta sama koncepcja? Jak inaczej oblicza się specularity dla cieniowania rampowego w porównaniu do blinn-phonga lub Lamberta?
W tradycyjnym cieniowaniu Blinn / Phong obliczasz rozproszony składnik piksela, mierząc cosinus kąta między normalną na powierzchni a kierunkiem światła. W takim przypadku prosty moduł cieniujący wyglądałby mniej więcej tak:
float DiffuseCoeff(in float3 pos, in float3 normal, in float3 lightPos) {
float3 lightDir = lightPos - pos;
lightDir.normalize();
return max(0.0, Dot(lightDir, normal));
}
W cieniowaniu rampą chodzi o modulowanie współczynnika rozproszenia za pomocą tekstury wyszukiwania 1D. W zależności od tego, co umieścisz w tej teksturze, możesz generować różne efekty. Dlatego nasza funkcja cieniowania do obliczania współczynnika rozproszenia staje się:
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);
}
Na przykład, jeśli chcielibyśmy wdrożyć moduł cieniujący komórki, moglibyśmy wygenerować teksturę rampy, która emuluje funkcję kroku:
Możesz użyć tego samego pomysłu, aby wygenerować różne efekty również dla oświetlenia lustrzanego. „Rampowanie” naprawdę odnosi się tylko do pomysłu modulacji wartości cieniowania za pomocą tekstury.
EDYCJA : Team Fortress 2 korzysta z modułu cieniującego podczas renderowania. Możesz sprawdzić szczegóły w tym dokumencie:
http://www.valvesoftware.com/publications/2007/NPAR07_IllustrativeRenderingInTeamFortress2.pdf
Spójrz na sekcję 5, w podsekcji zatytułowanej „Diffuse Warping Function”