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成分の値を と の角度の余弦値によって三段階に分けているだけです。
以下のように猿はなりました。
輪郭線とかも表示できれば、もっと漫画っぽくなるみたいです。