マイケル
みなさんこんにちは!
マイケルです!
マイケルです!
エレキベア
こんにちクマ〜〜〜
マイケル
新年一発目の記事は、みんな大好きトゥーンシェーダーの実装だ!
エレキベア
ついに来たクマか・・・
マイケル
トゥーン調陰影から、輪郭線描画まで行って、
更にその改善まで行うので本格的な内容になっています!
更にその改善まで行うので本格的な内容になっています!
エレキベア
それは楽しみクマ〜〜〜
トゥーン調の陰影の実装
マイケル
まずはトゥーン調の陰影の実装から!
今回は
・コード内で設定する方法
・ランプテクスチャで設定する方法
の2つを解説します!
今回は
・コード内で設定する方法
・ランプテクスチャで設定する方法
の2つを解説します!
コード内で設定する方法
マイケル
コード内で陰影を設定する方法として、法線と光の方向の内積の値からしきい値を設ける方法があります。
実装内容は下記になります。
実装内容は下記になります。
マイケル
こちらはオモチャラボさんの下記の記事を参考にさせていただいています!
輪郭線の実装もこちらの記事を見させていただいています!
輪郭線の実装もこちらの記事を見させていただいています!
【Unityシェーダ入門】アウトラインシェーダを作る | おもちゃラボ
マイケル
陰影の実装部分は下記になっています。
↑内積の値からしきい値を設ける
エレキベア
シンプルな実装クマね
マイケル
こちらの実行結果は下記になります。
問題なく陰影が付き、光の方向によって変わるのも確認できます。
問題なく陰影が付き、光の方向によって変わるのも確認できます。
エレキベア
おお〜〜〜トゥーンっぽいクマ〜〜
ランプテクスチャで設定する方法
マイケル
前述の内容でもコードを書き換えれば陰影も変えることができますが、
ランプテクスチャとして用意して参照することで、テクスチャを変えるだけで陰影を変えることができるようになります。
ランプテクスチャとして用意して参照することで、テクスチャを変えるだけで陰影を変えることができるようになります。
エレキベア
このテクスチャの色を陰影とするクマね
マイケル
具体的な実装は下記になります。
マイケル
陰影の描画部分は下記!
ランプテクスチャの縦方向の中心と、内積の結果を座標として参照するようにしています。
ランプテクスチャの縦方向の中心と、内積の結果を座標として参照するようにしています。
エレキベア
さっきのコードで書いてた部分をテクスチャ参照にしたわけクマね
マイケル
こちらの実行結果は下記!
エレキベア
こっちもいい感じクマね
マイケル
試しに下記のようなテクスチャに変えてみると、陰影結果も変わることが確認できます!
エレキベア
緑っぽくなったクマ〜〜〜
輪郭線の実装
背面法を使用する方法
マイケル
陰影ができたところで、次は輪郭線を実装します。
こちらは下記の記事でも少し紹介した、「背面法」という手法を使用した実装になります。
こちらは下記の記事でも少し紹介した、「背面法」という手法を使用した実装になります。
エレキベア
確か、モデルを膨脹して裏面を通常モデルの後ろに描画することで輪郭線っぽく見せる手法だったクマね
マイケル
その通り!
2回描画する必要があるから、パスも2つ分必要になってくるよ!
実装は下記になります!
2回描画する必要があるから、パスも2つ分必要になってくるよ!
実装は下記になります!
マイケル
アウトライン描画部分は下記のパスで、「Cull Front」指定することで裏面を描画するようにしています。
エレキベア
頂点座標は法縁方向に膨脹させているクマね
マイケル
こちらの描画結果は下記になります!
エレキベア
ちゃんと輪郭線クマ〜〜〜
でも、キューブの方が何か変になってるクマね
でも、キューブの方が何か変になってるクマね
マイケル
そう、背面法の欠点として、ハードエッジモデルの輪郭描画がおかしくなってしまうという問題があるんだ。
こちらの対処法はこの後解説します!
こちらの対処法はこの後解説します!
ハードエッジモデルへの対応
マイケル
ハードエッジモデルの輪郭線を綺麗に描画する方法として、
輪郭線描画の時だけソフトエッジの法線情報を参照するという方法があります。
輪郭線描画の時だけソフトエッジの法線情報を参照するという方法があります。
マイケル
そのため、モデルの情報としてソフトエッジの法線情報を別で持たせる方法がありますが、
今回は下記の記事で紹介されている「Unityスクリプトで法線情報をソフトエッジ情報に変換して頂点カラーに埋め込む」方法で実装してみます!
今回は下記の記事で紹介されている「Unityスクリプトで法線情報をソフトエッジ情報に変換して頂点カラーに埋め込む」方法で実装してみます!
輪郭線を少しだけ綺麗に描画する | シンソフィアではたらく人のブログ
マイケル
実装は下記になります!
同じ位置の頂点の法線座標を平均したものをそれぞれ設定する、といった内容になっています。
同じ位置の頂点の法線座標を平均したものをそれぞれ設定する、といった内容になっています。
エレキベア
なるほどクマ〜〜〜
ソフトエッジのモデルはそういう意味だったのクマね
ソフトエッジのモデルはそういう意味だったのクマね
マイケル
あとは下記のように、頂点を膨脹する際に埋め込んだ頂点カラーを参照するようにすれば完成です!
マイケル
こちらの描画結果は下記になります!
エレキベア
おお〜〜〜〜
ハードエッジのモデルも綺麗に描画されてるクマ〜〜〜
ハードエッジのモデルも綺麗に描画されてるクマ〜〜〜
アウトラインのマスク対応
マイケル
これで大体綺麗に描画できるようになったのですが、
それでも下記のようにどうしても汚く描画されてしまうことがあります。
それでも下記のようにどうしても汚く描画されてしまうことがあります。
エレキベア
うええぇ・・・・
マイケル
特にキャラクターの目元が顕著に出てきますね・・・
こちらの対処法として、輪郭線のアルファ値を記録したテクスチャを用意して参照することで、不要な部分は輪郭線描画しないといった手法があります。
こちらの対処法として、輪郭線のアルファ値を記録したテクスチャを用意して参照することで、不要な部分は輪郭線描画しないといった手法があります。
エレキベア
少々無理やりクマが、仕方ないクマね・・・
マイケル
こちらの実装は下記の通り!
法線膨脹時にテクスチャをalpha値として参照して掛け合わせるだけですね
法線膨脹時にテクスチャをalpha値として参照して掛け合わせるだけですね
エレキベア
ちょいと味付けしたくらいクマね
マイケル
アルファテクスチャを適当に設定して描画した結果は下記になります!
エレキベア
おお〜〜〜綺麗になったクマ〜〜〜
マイケル
まだ少し汚い部分はあるけど、微調整すればよさそうだね!
おわりに
マイケル
というわけで今回はトゥーンシェーダーの実装でした!
どうだったかな??
どうだったかな??
エレキベア
案外簡単だったクマが、輪郭線を綺麗に描画するのが中々面倒クマね
マイケル
輪郭線描画は、万能な方法が見つかってないと言われるから一工夫必要だね・・・
ポストエフェクトで輪郭線描画する方法もあるみたいだから、その内実装してみたいね!
ポストエフェクトで輪郭線描画する方法もあるみたいだから、その内実装してみたいね!
マイケル
それでは今日はこの辺で!
アデューー!!
アデューー!!
エレキベア
クマ〜〜〜〜
【Unity】トゥーンシェーダーを一から自作する(陰影+輪郭線)【シェーダー】〜完〜