BlenderでOSL(Open Shading Language)を使用して、簡単なトゥーンシェーダーを実装してみようと思います。
イメージとして以下の図のような感じです。
ベクトルのなす角(θ)が小さければモデルを明るくし、大きければ暗くします(サンプルは少し違いますが・・・・)。
シェーダー
shader toon_shader(
//テクスチャ
color texture_color = color(0.0,0.0,0.0),
//法線
normal n = N,
//ライトの方向
vector light_direction = vector(1.0,1.0,-1.0),
//ライトの色
color light_color = color(1.0,1.0,1.0),
//最終的なカラー
output color final_color = color(0.0,0.0,0.0)
)
{
final_color = texture_color;
color light = color(0.0,0.0,0.0);
//ライト方向を正規化。
vector light_dir = normalize(light_direction);
//法線とライトの方向からランバート拡散反射光を計算。
float lambert = clamp(dot(-n,light_dir),0.0,1.0);
lambert *= lambert;
//値を一定値で分ける。
if(lambert > 0.15)
{
lambert = 1.0;
}
else
{
lambert = 0.3;
}
light += light_color * lambert;
//計算したライティングの値を乗算。
final_color *= light;
}