Что такое затенение или освещение рампы и как оно работает? Это отличается от Toon Shading или это та же концепция? Как по-разному рассчитывается зеркальность для затенения рампы по сравнению с блинн-фонгом или ламбертом?
При традиционном затенении Блинна / Фонга вы вычисляете диффузный член для пикселя, измеряя косинус угла между нормалью на поверхности и направлением света. Итак, в этом случае простой шейдер будет выглядеть примерно так:
float DiffuseCoeff(in float3 pos, in float3 normal, in float3 lightPos) {
float3 lightDir = lightPos - pos;
lightDir.normalize();
return max(0.0, Dot(lightDir, normal));
}
В режиме линейного затенения идея состоит в том, чтобы модулировать коэффициент диффузии с помощью 1-мерной текстуры поиска. В зависимости от того, что вы положили в эту текстуру, вы можете создавать различные эффекты. Следовательно, наша функция шейдера для вычисления коэффициента диффузии становится:
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);
}
Например, если мы хотим реализовать шейдер ячейки, мы могли бы создать текстуру линейного изменения, которая эмулирует пошаговую функцию:
Вы можете использовать ту же идею для создания различных эффектов и для зеркального освещения. Затенение «линейного изменения» в действительности относится только к идее модуляции значения затенения с помощью текстуры.
РЕДАКТИРОВАТЬ : Team Fortress 2 использует рамповый шейдер при рендеринге. Вы можете проверить детали в этом документе:
http://www.valvesoftware.com/publications/2007/NPAR07_IllustrativeRenderingInTeamFortress2.pdf
Посмотрите в Разделе 5 подраздел «Диффузная деформация».