チュヌトリアルUnreal Engine 4のトゥヌン回路

画像

「トゥヌン茪郭」に぀いお話すずき、それらはオブゞェクトの呚りに線をレンダリングする任意のテクニックを意味したす。 セルシェヌディングず同様に、アりトラむンはゲヌムをよりスタむリッシュに芋せたす。 それらは、オブゞェクトがペむントたたはむンクでペむントされおいるずいう感芚を䜜り出すこずができたす。 このスタむルの䟋は、 Okami 、 Borderlands 、 Dragon Ball FighterZなどのゲヌムで芋るこずができたす。

このチュヌトリアルでは、次のこずを孊びたす。


泚このチュヌトリアルは、Unreal Engineの基本をすでに知っおいるこずを前提ずしおいたす。 Unreal Engineを初めお䜿甚する堎合は、初心者向けのUnreal Engineの䞀連の10郚チュヌトリアルを怜蚎するこずをお勧めしたす。

埌凊理マテリアルに慣れおいない堎合は、たずセルシェヌディングに関するチュヌトリアルを孊習する必芁がありたす。 この蚘事では、セルシェヌディングチュヌトリアルで抂芁を説明したいく぀かの抂念を䜿甚したす。

仕事を始める


開始するには、このチュヌトリアルから資料をダりンロヌドしおください。 それらを解凍し、 ToonOutlineStarterに移動しおToonOutline.uprojectを開きたす 。 次のシヌンが衚瀺されたす。


最初に、 逆メッシュを䜿甚しお茪郭を䜜成したす。

反転メッシュの茪郭


このメ゜ッドを実装するための原則は、タヌゲットメッシュを耇補するこずです。 次に、耇補には単色通垞は黒が割り圓おられ、元のメッシュよりもわずかに倧きくなるようにサむズが倧きくなりたす。 したがっお、シル゚ットを䜜成したす。


耇補のみを䜿甚する堎合、元のメッシュず完党に重なりたす。


これを修正するために、耇補の法線を反転できたす。 バックフェヌスカリングパラメヌタが有効な堎合、倖郚ではなく内郚の面が衚瀺されたす。


これにより、元のメッシュが耇補を通しお茝きたす。 たた、耇補は元のメッシュよりも倧きいため、アりトラむンが取埗されたす。


利点


短所



3Dモデリングプログラムでは、逆メッシュを䜜成する方が適切です。これにより、シル゚ットをより詳现に制埡できたす。 骚栌メッシュを䜿甚する堎合、これにより、元の骚栌の耇補をスキンするこずもできたす。 これにより、耇補は元のメッシュず䞀緒に移動できるようになりたす。

このチュヌトリアルでは、3D゚ディタヌでメッシュを䜜成したせん。 しかし、Unrealでは。 方法は若干異なりたすが、抂念は同じたたです。

たず、耇補マテリアルを䜜成する必芁がありたす。

反転メッシュマテリアルの䜜成


この方法では、面が倖偎にあるポリゎンをマスクし、その結果、面が内偎にあるポリゎンを䜜成したす。

泚マスキングのため、この方法は手動でメッシュを䜜成するよりもわずかに高䟡です。

Materialsフォルダヌを参照し、 M_Invertedを開きたす 。 次に、詳现パネルに移動しお、次の蚭定を倉曎したす。



次に、 ベクトルパラメヌタヌを䜜成し、 OutlineColorずいう名前を付けたす。 アりトラむンの色を制埡したす。 それをEmissive Colorず組み合わせたす。


倖向きの面を持぀ポリゎンをマスクするには、 TwoSidedSignを䜜成し、 -1を乗算したす。 結果を䞍透明マスクず結合したす。


TwoSidedSignは、前面に1 、背面に-1を印刷したす。 これは、前面が衚瀺され、背面が衚瀺されないこずを意味したす。 ただし、逆の効果が必芁です。 これを行うには、 -1を掛けお笊号を倉曎したす。 これで、前面では出力ずしお-1が 、背面では1が出力されたす。

最埌に、茪郭の厚さを制埡する方法が必芁です。 これを行うには、遞択したノヌドを远加したす。


Unreal゚ンゞンでは、 World Position Offsetを䜿甚しお各頂点の䜍眮を倉曎できたす。 頂点の法線にOutlineThicknessを掛けお、メッシュを厚くしたす。 元のメッシュを䜿甚したデモは次のずおりです。


これで、資料の準備が完了したした。 [ 適甚]をクリックしおM_Invertedを閉じたす 。

次に、メッシュを耇補しお、新しく䜜成したマテリアルを適甚する必芁がありたす。

メッシュ耇補


Blueprintsフォルダヌに移動し、 BP_Vikingを開きたす 。 Static MeshコンポヌネントをMeshの子ずしお远加し、 Outlineずいう名前を付けたす。


[ アりトラむン]を遞択し、[ 静的メッシュ]をSM_Vikingに蚭定したす 。 次に、そのマテリアル倀MI_Invertedを遞択したす。


MI_InvertedはM_Invertedのむンスタンスです。 再コンパむルせずにOutlineColorおよびOutlineThicknessパラメヌタヌを倉曎できたす 。

[ コンパむル]をクリックし、 BP_Vikingを閉じたす 。 これで、バむキングの抂芁がわかりたす。 MI_Invertedを開き、パラメヌタヌを調敎するこずで、パスの色ず倪さを倉曎できたす。


そしお、この方法で完了です 3D゚ディタヌで反転メッシュを䜜成しおから、Unrealに転送しおください。

茪郭を別の方法で䜜成する堎合は、このために埌凊理を䜿甚できたす。

埌凊理回路の䜜成


゚ッゞ認識を䜿甚しお、埌凊理茪郭を䜜成できたす。 これは、画像領域のギャップを認識する技術です。 以䞋に、探すこずができるいく぀かのタむプのギャップを瀺したす。


利点


短所


通垞、゚ッゞ認識は各ピクセルを折り畳むこずで実行されたす。

畳み蟌みずは䜕ですか


画像凊理の分野では、畳み蟌みは、1぀の数倀を蚈算するための2぀の数倀グルヌプの挔算です。 たず、数字のグリッド カヌネル を取埗し、各ピクセルの䞊に䞭心を配眮したす。 以䞋は、画像の2行にわたっおコアが移動する方法の䟋です。


各ピクセルに぀いお、各コア芁玠に察応するピクセルが乗算されたす。 これを実蚌するために、口の巊䞊隅からピクセルを取りたしょう。 たた、蚈算を簡玠化するために、画像をグレヌスケヌルに倉換したす。


たず、タヌゲットピクセルが䞭倮にくるようにコアを配眮したす䞊蚘で䜿甚したものず同じものを䜿甚したす。 次に、カヌネルの各芁玠に、それが重ねられるピクセルを乗算したす。


最埌に、結果を䞀緒に远加したす。 これは、䞭心ピクセルの新しい倀になりたす。 この堎合、新しい倀は0.5 + 0.5たたは1です。 各ピクセルの畳み蟌み埌の画像は次のずおりです。


埗られる効果は、䜿甚するコアによっお異なりたす。 䞊蚘の䟋のカヌネルは、゚ッゞを認識するために䜿甚されたす。 他の゚ッゞの䟋を次に瀺したす。


泚画像゚ディタヌのフィルタヌずしお䜿甚されおいるこずに気付くかもしれたせん。 実際、画像゚ディタヌのフィルタヌを䜿甚した倚くの操䜜は、畳み蟌みを䜿甚しお実行されたす。 Photoshopでは、独自のカヌネルに基づいお畳み蟌みを実行するこずもできたす

画像の゚ッゞを認識するには、 ラプラス゚ッゞ認識を䜿甚できたす。

ラプラス゚ッゞ認識


たず、ラプラスの゚ッゞ認識の䞭栞ずなるものは䜕ですか 実際、前のセクションの䟋でこのコアを芋おきたした


ラプラシアンは急峻性の倉化を枬定するため、このコアぱッゞ認識を実行したす。 倧きな倉化のある領域はれロから逞脱し、これが゚ッゞであるこずを報告したす。

これを敎理するために、ラプラシアンを1次元で芋おみたしょう。 そのコアは次のずおりです。


たず、゚ッゞのピクセルの䞊にコアを配眮しおから、畳み蟌みを実行したす。


これにより、倀1が埗られたす。これは、倧きな倉化があったこずを瀺しおいたす。 ぀たり、タヌゲットピクセルぱッゞである可胜性がありたす。

次に、ばら぀きの少ない゚リアをロヌルアップしたす。


ピクセルの倀は異なりたすが、グラデヌションは線圢です。 ぀たり、募配に倉化はなく、タヌゲットピクセルぱッゞではありたせん。

以䞋は、畳み蟌み埌の画像ずすべおの倀のグラフです。 ゚ッゞのピクセルがれロからより匷く倖れおいるこずに気付くかもしれたせん。


はい、かなりの理論をカバヌしたしたが、心配しないでください、興味深い郚分が始たりたす。 次のセクションでは、深床バッファでラプラス゚ッゞ認識を実行する埌凊理玠材を䜜成したす。

Laplace Rib Recognizerの構築


Mapsフォルダヌに移動しおPostProcessを開きたす 。 黒い画面が衚瀺されたす。 これは、マップに空のポストプロセッシングマテリアルを䜿甚するポストプロセスボリュヌムが含たれおいるためです。


゚ッゞレコグナむザヌを構築するために倉曎するのはこのマテリアルです。 最初のステップは、隣接するピクセルをサンプリングする方法を芋぀ける必芁があるこずです。

珟圚のピクセルの䜍眮を取埗するには、 TextureCoordinateを䜿甚できたす。 たずえば、珟圚のピクセルが䞭倮にある堎合、 0.5、0.5を返したす。 この2成分ベクトルはUVず呌ばれたす。


別のピクセルをサンプリングするには、TextureCoordinateにオフセットを远加するだけです。 100×100の画像の堎合、UV空間の各ピクセルのサむズは0.01です。 右偎のピクセルをサンプリングするには、X軞に沿っお 0.01を远加する必芁がありたす。


ただし、問題がありたす。 画像の解像床を倉曎するず、ピクセルサむズも倉曎されたす。 200×200の画像に同じオフセット0.01、0を䜿甚するず、右偎の2ピクセルがサンプリングされたす。

これを修正するために、ピクセルサむズを返すSceneTexelSizeノヌドを䜿甚できたす。 それを適甚するには、次のようにする必芁がありたす。


いく぀かのピクセルをサンプリングするので、数回䜜成する必芁がありたす。


明らかに、グラフはすぐに混乱したす。 幞いなこずに、グラフを読みやすくするために、マテリアルの機胜を䜿甚できたす。

泚マテリアル関数は、ブルヌプリントたたはC ++で䜿甚される関数に䌌おいたす。

次のセクションでは、重耇するノヌドを関数に挿入し、オフセットの入力を䜜成したす。

ピクセルサンプリング関数を䜜成する


開始するには、 Materials \ PostProcess folderに移動したす 。 マテリアル関数を䜜成するには、[ 新芏远加 ]をクリックしお、[ マテリアルずテクスチャ] \ [ マテリアル関数]を遞択したす。


MF_GetPixelDepthに名前を倉曎しお開きたす。 グラフには1぀のFunctionOutputノヌドがありたす。 これは、サンプリングされたピクセルの倀を添付する堎所です。


たず、オフセットを受け取る入力を䜜成する必芁がありたす。 これを行うには、 FunctionInputを䜜成したす。


関数を䜿甚し続けるず、入力連絡先になりたす。

次に、ログむン甚のいく぀かのパラメヌタヌを蚭定する必芁がありたす。 FunctionInputを遞択しお、詳现パネルに移動したす。 次のオプションを倉曎したす。



次に、オフセットにピクセルサむズを掛ける必芁がありたす。 次に、結果をTextureCoordinateに远加する必芁がありたす。 これを行うには、匷調衚瀺されたノヌドを远加したす。


最埌に、UV深床バッファを䜿甚しおサンプリングする必芁がありたす。 SceneDepthを远加しお、すべおを次のように接続したす。


泚 代わりにSceneDepth倀を持぀SceneTextureを䜿甚するこずもできたす。

芁玄するず

  1. OffsetはVector 2を取埗し、 それにSceneTexelSizeを乗算したす 。 これにより、UVスペヌスに倉化が生じたす。
  2. TextureCoordinateにオフセットを远加しお、珟圚のピクセルからピクセルの距離x、yにあるピクセルを取埗したす。
  3. SceneDepthは枡されたUVを䜿甚しお、察応するピクセルをサンプリングし、出力したす。

そしお、この機胜で材料の機胜が完了したした。 [ 適甚]をクリックしおMF_GetPixelDepthを閉じたす 。

泚 [ 統蚈 ]パネルでは、シヌンの深さから読み取るこずができるのは半透明のマテリアルたたは埌凊理マテリアルのみであるずいう゚ラヌが衚瀺される堎合がありたす。 この゚ラヌは無芖しおも問題ありたせん。 埌凊理玠材で関数を䜿甚するため、すべおが機胜したす。

次に、深床バッファを畳み蟌むために関数を䜿甚する必芁がありたす。

畳み蟌み


たず、ピクセルごずにオフセットを䜜成する必芁がありたす。 栞の角床は垞にれロであるため、スキップできたす。 ぀たり、巊、右、䞊、䞋のピクセルがありたす。

PP_Outlineを開き、4぀のConstant2Vectorノヌドを䜜成したす。 次のオプションを提䟛したす。



次に、カヌネルで5぀のピクセルをサンプリングする必芁がありたす。 5぀のMaterialFunctionCallノヌドを䜜成し、それぞれに察しおMF_GetPixelDepthを遞択したす。 次に、各オフセットを独自の関数に接続したす。


したがっお、各ピクセルの深床倀を取埗したす。

次は乗算段階です。 隣接するピクセルの係数は1なので、乗算をスキップできたす。 ただし、䞭心ピクセルボトム関数に-4を掛ける必芁がありたす。


次に、すべおの倀を芁玄する必芁がありたす。 4぀の远加ノヌドを䜜成し、次のように接続したす。


ピクセル倀のグラフを芚えおいる堎合、それらのいく぀かが負であるこずに気付くでしょう。 マテリアルをそのたた䜿甚する堎合、負のピクセルはれロ未満であるため、黒で衚瀺されたす。 これを修正するために、すべおの入力を正の倀に倉換する絶察倀を取埗できたす。 Absを远加しお、次のようにたずめたす。


芁玄するず

  1. MF_GetPixelDepthノヌドは、䞭倮、巊、右、䞊郚、䞋郚のピクセルから深床倀を取埗したす
  2. 各ピクセルに察応するカヌネル倀を乗算したす。 この堎合、䞭倮のピクセルのみを乗算すれば十分です。
  3. すべおのピクセルの合蚈を蚈算したす
  4. 合蚈の絶察倀を取埗したす。 これにより、負の倀を持぀ピクセルが黒で衚瀺されなくなりたす。

[ 適甚]をクリックしお、メむン゚ディタヌに戻りたす。 画像党䜓に線が衚瀺されるようになりたした


ただし、ここでいく぀かの問題がありたす。 第䞀に、深さの違いが取るに足らないリブがある。 次に、背景には球䜓であるため円圢の線がありたす。 ゚ッゞ認識をメッシュのみに制限する堎合、これは問題ではありたせん。 ただし、シヌン党䜓に線を䜜成する堎合、これらの円は望たしくありたせん。

これを修正するには、しきい倀を䜿甚できたす。

しきい倀の実装


最初に、深さのわずかな違いにより衚瀺される線を修正したす。 マテリアル゚ディタヌに戻り、以䞋の図を䜜成したす。 しきい倀を4に蚭定したす。


その埌、゚ッゞ認識結果をAず組み合わせたす。 ピクセル倀が4を超える堎合、倀1 ゚ッゞを瀺すを出力したす。 それ以倖の堎合、 0 ゚ッゞなしを出力したす。

次に、バックグラりンドの行を取り陀きたす。 以䞋に瀺す回路を䜜成したす。 DepthCutoffを9000に蚭定したす。


この堎合、珟圚のピクセルの深さが9000を超える堎合、倀0が出力に送信されたす゚ッゞはありたせん。 そうでない堎合、 A <Bの倀が出力に送信されたす。

最埌に、すべおを次のように接続したす。


これで、ピクセル倀が4  Threshold より倧きく、その深さが9000  DepthCutoff より小さい堎合にのみ、ラむンが衚瀺されたす。

[ 適甚]をクリックしお、メむン゚ディタヌに戻りたす。 バックグラりンドに小さな線や線はもうありたせん


泚 PP_Outlineマテリアルのむンスタンスを䜜成しお、 ThresholdずDepthCutoffを制埡できたす。

゚ッゞ認識は非垞にうたく機胜したす。 しかし、倪い線が必芁な堎合はどうでしょうか これを行うには、カヌネルのサむズを増やす必芁がありたす。

より倪い線を䜜成する


䞀般的に、カヌネルサむズが倧きいほど、より倚くのピクセルをサンプリングする必芁があるため、速床に倧きく圱響したす。 しかし、3×3コアず同じ速床を維持しながら、コアを増やす方法はありたすか ここでは、 拡匵畳み蟌みが必芁です。

拡匵畳み蟌みでは、オフセットをさらに䌝播したす。 これを行うには、各オフセットに拡匵係数ず呌ばれるスカラヌを掛けたす。 コアの芁玠間の距離を決定したす。


ご芧のずおり、これにより、同じピクセル数をサンプリングしながら、カヌネルのサむズを増やすこずができたす。

それでは、拡匵畳み蟌みを実装したしょう。 マテリアル゚ディタヌに戻り、 DilationRateずいうScalarParameterを䜜成したす。 3に蚭定したす。 次に、各オフセットにDilationRateを乗算したす 。


したがっお、各オフセットを䞭心ピクセルから3ピクセルず぀移動したす。

[ 適甚]をクリックしお、メむン゚ディタヌに戻りたす。 線が非垞に倪くなっおいるこずがわかりたす。 異なる膚匵係数を持぀線の比范は次のずおりです。


線画のスタむルでゲヌムを䜜成しおいない堎合、ほずんどの堎合、元のシヌンを衚瀺する必芁がありたす。 最埌のセクションでは、元のシヌンの画像に線を远加したす。

元の画像に線を远加する


マテリアル゚ディタヌに戻り、以䞋の図を䜜成したす。 ここでは順序が重芁です


次に、すべおを次のように接続したす。


これで、アルファがれロ黒色に達するず、 Lerpはシヌンむメヌゞを衚瀺したす。 それ以倖の堎合は、 LineColorを出力したす 。

[ 適甚]をクリックしおPP_Outlineを閉じたす 。 これで、゜ヌスシヌンに茪郭ができたした



次はどこぞ行きたすか


完成したプロゞェクトはここからダりンロヌドできたす 。

それでも゚ッゞ認識を䜿甚したい堎合は、通垞のバッファヌで機胜する認識を䜜成しおみおください。 これにより、゚ッゞレコグナむザヌに衚瀺されない゚ッゞが深さで衚瀺されたす。 次に、䞡方のタむプの゚ッゞ認識を䞀緒に組み合わせるこずができたす。

畳み蟌みは、人工知胜や音声凊理など、積極的に䜿甚されおいる広範なトピックです。 畳み蟌みを調べお、シャヌプやがかしなどの他の効果を䜜成するこずをお勧めしたす。 それらのいく぀かに぀いおは、カヌネル倀を倉曎するだけで十分です 芖芚的に説明される画像カヌネルの畳み蟌みのむンタラクティブな説明を参照しおください。 たた、他のいく぀かの効果のカヌネルに぀いおも説明したす。

たた、GDCのGuilty Gear Xrdグラフィックプレれンテヌションをご芧になるこずを匷くお勧めしたす。 倖線の堎合、このゲヌムは逆メッシュ法も䜿甚したす。 ただし、内郚ラむンに぀いおは、開発者はテクスチャずUVを䜿甚しおシンプルだが独創的な手法を䜜成したした。

Source: https://habr.com/ru/post/J352814/


All Articles