プログラミング 見習い

プログラミングの勉強の学習日記的なブログ

OpenGLを学ぼうと足掻く トゥーンシェーディングの実装

今度は簡単なトゥーンシェーディングをやってみます。
前回作ったフォンシェーディングのフラグメントシェーダを以下のように変更します。

#version 120
varying vec3 Position;
varying vec3 Normal;
void main() {
  int levels = 3;
  float scaleFactor = 1.0 / levels;
  vec4 LightPosition = vec4(100.0, 100.0, 10.0, 1.0);
  vec3 Kd = vec3(1.0, 1.0, 1.0);
  vec3 Ka = vec3(0.4, 0.4, 0.2);
  vec3 LightIntensity = vec3(1.0, 1.0, 1.0);
  vec3 s = normalize(vec3(LightPosition) - Position);
  float cosine = max(0.0, dot(s, Normal));
  vec3 diffuse = Kd * floor(cosine * levels) * scaleFactor;
  gl_FragColor = vec4(LightIntensity * (Ka + diffuse), 1.0);
}

特にいうことはないです。
Diffuse成分の値を  \vec{s} \vec{n} の角度の余弦値によって三段階に分けているだけです。

以下のように猿はなりました。
f:id:Code-C:20140314193156p:plain
輪郭線とかも表示できれば、もっと漫画っぽくなるみたいです。