RenderingUnityのシェーダで3Dモデルにテクスチャを投影する投影テクスチャマッピングを実装する方法をまとめました。関連Unity2019.2.18はじめにこの記事では投影テクスチャマッピングを実装する方法についてまとめます。投影テクスチャマッピングとは、現実世界のプロジェクターのように、3Dモデルに画像を投影する技術です。実装する上で座標変換の基礎知識が前提となりますが、これについては以下の記事にまとめていますので必要に応じて参照してください。仕組みとしては、まずカメラのように視錐台情報を持つプロジェクターを作ります。投影する3Dモデルに対して、このプロジェクターのビュー行列とプロジェクション行列を渡します。次に3Dモデルを描画します。このとき、通常の描画処理に加えて、頂点をプロジェクターのビュー行列とプロジェクション行列で座標変換します。この処理により、プロジェクターのプロジェクション空間における頂点座標が求められます。あとはこの空間におけるxy座標に応じてテクスチャをサンプリングすることで、プロジェクターの効果が得られます。スクリプトそれでは実際に実装していきます。}}カメラと同じように視錐台を定義するための変数を用意し、VP行列を渡しています。注意点として、ビュー行列をシェーダに渡すときにはtransform.worldToLocalMatrixのz値の符号を反転させる必要があります。プロジェクション行列はGL.GetGPUProjectionMatrix()で変換することでプラットフォーム間の差を吸収します。これについては以下の記事で説明しています。light11.hatenadiary.comまた、投影するためのテクスチャと、投影するかどうかを決めるための判定に使うプロジェクターの座標も渡しています。今回はこれらの行列をGlobalなプロパティとしてマテリアルに渡していますが、プロジェクターが複数存在する場合のことを考えるとマテリアルへの受け渡しはもう少し工夫するべきです。シェーダ次に投影されるモデルにアサインするためのシェーダを書きます。}}まず頂点シェーダでプロジェクターから渡した_ProjectorMatrixVPを使って座標変換を行います。ComputeScreenPos()を使ってからフラグメントシェーダでw除算することでプロジェクション座標に変換しています。このあたりの詳細については以下の記事にまとめていますので、必要に応じて参照してください。light11.hatenadiary.comプロジェクション座標に変換出来たらあとはxy座標を使ってテクスチャをマッピングするだけです。上記のシェーダでは、法線やプロジェクターの座標を使って範囲外の描画が行われないようにする処理も追加しています。結果このスクリプトを適当なGameObjectにアタッチして、テクスチャを設定してプロジェクターを作ります。シェーダをPlaneモデルにアサインします。すると以下のようにPlaneモデルにプロジェクターがテクスチャを投影したレンダリング結果が得られます。1はてなブログをはじめよう!halya_11さんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。