Just My Life & My Work

卡通渲染 (Toon Shading)

計圖課程到了尾聲,當OpenGL已經學習到一個階段,老師還要教我們GLSL,也就是Shader,第一個例子就是卡通渲染 (Toon Shading)。哈~當時我搞不懂「toon」是什麼意思,原來是「卡通」!這樣子就很好想像,為何渲染結果會不真實,就不用怪罪Shader畫出來的品質好差XD~

Toon-shader

好啦~這裡要解釋一下定義:卡通渲染(Catoon Rendering/Toon Shading/Cel Shading)NPR(Non-PhotoRealistic)技術中的一種。下面是關於卡通渲染的定義:

Cel shading is a flat looking 3D image, with a cartoonish look exemplified by animated movies.The basic elements of a cel shaded effect are :

  • Sharp shadows
  • Little or no highlight
  • Outline around objects

其中邊界 (outline)繪製是關鍵。卡通渲染中的邊界有以下幾種:

  1. Boundary or border edge:僅為一個多邊形所擁有的邊界。一個立體造型一般是沒有這樣的邊界;
  2. Crease or hard edge:為2個多邊形共有的邊界,而且2個多邊形的夾角(dihedral angle)大於一個閾值。這個閾值的參考值為60度;
  3. Material edge:不同材質的2個多邊形的公共邊界,也可是藝術家希望總是顯示的線條;
  4. Silhouette edge:相對於當前觀察方向而言,面向不同朝向的2個多邊形的公共邊界。

toonexample卡通渲染是一種非真實感渲染(non-photorealistic render)。而卡通著色是一種簡單非真實著色。它運用很少的顏色通常是顏色調和,所以經常是從一種色調變化到另一種色調,但是給人一種三維模型的感覺。

上面茶壺出現的色調是基於角度來著色,實際上是光照方向與法線方向的cosine值。

於是,當法線方向與光照方向較近的情況下,將會出現較亮的色調;當光照方向與法線方向的夾角很大時,渲染的地方就會很暗。換句話而言就是,夾角的cosine值會影響色調的強度。

Cosine值的計算可以利用下面這個公式,也就是點積公式。

  • cos(lightDir, normal) = lightDir . normal / ( |lightDir| * |normal| )

當法線向量和光照都被正規化:

  • | normal | = 1
  • | lightDir | = 1

這個公式將被簡化成:

  • cos(lightDir, normal) = lightDir . normal

因此,我們定義一個名字為intensity的變數用來存儲cosine的值。在glsl中,這個值透過點積計算出來。

  • intensity = dot(lightDir, gl_Normal);

總觀之,很像影像處理的二值化,設定一個門檻值(threshold),大於等於它設1,小於它則設0。同樣的道理可再推廣,設定多個門檻值,讓顏色的變化比較平順不突兀。例如上圖茶壺,一共設定3個門檻值,因此會呈現4種顏色的漸層

參考:卡通渲染(Toon Shading/Cel Shading)Toon Shading Using GLSLLighthouse3d Toon ShadingCel-shaded animationToon Shading

隨意留個言吧:)~

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料

標籤雲