しゅみぷろ読者になるしゅみぷろプログラミングとかこの広告は、90日以上更新していないブログに表示しています。UnityTexturePaintはじめに塗り表現その5です。今回はとうとう、動的テクスチャペイントについて解説していきます。しゅみぷろ今までの記事では、ちょこちょこと法線マップやエフェクトについて書いてきました。今回はズバリ、「塗り」そのものについて書きます。順不同で適当に書いているわけですが、今回がメインディッシュで今までのは前座です。Enabledをチェックしないと正常に動作しない場合がある塗りの対象にMeshColliderを付ける必要がある(これは任意の点がモデル表面上に存在する場合にその位置のUVを算出することでどうにかなりそうなところまで行っていますが、今回はRaycastHitを使う前提で解説します)といった制約もありますのでご注意ください。ペイントまでの流れまずはペイントまでにどんなフローが存在するのか整理したいと思います。しゅみぷろでも書いていますが、改めて見ていきます。オブジェクトの塗りたい位置を決めるその位置はテクスチャでいうとどの部分なのか(Texcoord)求めるTexcoordを指定して、その部分にブラシ画像で色を塗れる専用のシェーダーに「塗れ!」と命令するという感じです。オブジェクトについているテクスチャに直接書き込むのではなく、最初にテクスチャを複製し、後のシェーディングではそのテクスチャを用いるようにします。UVの算出については以下も参考にしてください。esprog.hatenablog.comはじめに記述した通り、今回はUVの算出はRaycastHitのみで話を進めていきます。ペイント用コンポーネントペイントしたいオブジェクトにはMeshColliderDynamicPaintObjectの2つをアタッチします。MeshColliderはUnityが用意しているコンポーネントです。当たり判定を正確に取るために、MeshFilterと同じMeshを設定することを強くお勧めします。いうのも、オブジェクト表面上の点を正確に取ってこれないとUVの計算が出来ないためです。DynamicPaintObjectは以下のスクリプトです。Debug.LogError("テンポラリテクスチャの生成に失敗しました。Debug.LogError("ブラシが設定されていません。Debug.LogError("ブラシ用のマテリアルが設定されていません。Debug.LogWarning("初期化時にバンプマップテクスチャを生成していません。バンプマップ処理をスキップします。}}まだ不完全な部分もありますが、概ねこんな感じになっています。注目すべきはPaintメソッドです。この部分が『Texcoordを指定して、その部分にブラシ画像で色を塗れる専用のシェーダーに「塗れ!」と命令する』部分です。シェーダーに必要な値を渡してBlitしてるだけですので全く難しくないと思います。塗りシェーダーさて、「塗れ!」と命令されたシェーダーがどのように塗りを実現していくのかについて見ていきます。}}概ねこんな感じです。0.5で、テクスチャに塗るブラシのサイズと位置を計算しています。ちなみにこちらで紹介した法線マップを適用するシェーダーも基本的には同じですが、ブラシ用のテクスチャを参照して必要ない部分への法線マップの書き込みを制御しています。}}実際に使う近々、もうちょっとコード整理してUnityPackage形式で配布予定です。それまでしばしお待ち下さい。一応どんな感じで使えるのかだけ先に書いておきます。実際に使うために必要な手順はペイント用コンポーネント(DynamicPaintObject)をオブジェクトに取り付けてパラメーターを好きに弄るスクリプトから塗りを命令するだけです。Unityを使ったことがある方なら、1は簡単だと思います。2については、サンプルのコードを見てもらう方がはやいでしょう。}}DynamicPaintObjectを取得して、Paintメソッドを呼び出す。上記のサンプルではマウスクリック位置にレイを飛ばし、ヒットしたらDynamicPaintObjectを取得、Paint命令を出します。オーバーロードされている命令を使うことで、ブラシや色、サイズを変更したり出来るようになっています。)はてなブログをはじめよう!es_programさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。